為什麼你必須摒棄 Java,全面轉向 Kotlin 語言?
是時候開始玩一門現代的編程語言了!
我想告訴你一個名為 Kotlin 的新的編程語言,以及為什麼你要開始考慮使用它來開發你的下一個項目。我以前喜歡 Java ,但是去年我發現了 Kotlin ,只要有可能我就會用 Kotlin 來寫代碼。現在我實在無法想像有什麼地方只有 Java 能做,而 Kotlin 不能的。
Kotlin 是JetBrains開發的,這是一家開發了一整套IDEs的公司,諸如IntelliJ和ReSharper, 還有正在閃耀光芒的 Kotlin。這是一個務實而且簡潔的編程語言,真正讓人感覺身心愉悅的編程語言,而且效率非常高。
儘管 Kotlin 最終編譯成JavaScript,很快也將編譯成機器碼,但我們仍將聚焦於其主要的環境 —— JVM。
這裡有一堆你應該完全轉向 Kotlin 語言的理由:
0#Java 互操作性
Kotlin
是100% 與 Java 具備互操作性的。你可以使用 Kotlin 繼續你老的 Java 項目開發。所有你熟悉的 Java 框架仍然可用,任何框架,不管是 Kotlin 寫的,還是你固執 Java 小夥伴寫的都可以。
1#熟悉的語法
Kotlin 不是誕生於學術界的怪異語言。其語法是 OOP 領域的任何開發者都熟悉的,可以或多或少的有一些了解。當然和 Java 還是有些不同的,例如重構後的構造函數以及使用 val 的變數聲明等等。下面是一個基本的 Kotlin 示例代碼:
class Foo { val b: String = "b" // val means unmodifiable var i: Int = 0 // var means modifiable fun hello() { val str = "Hello" print("$str World") } fun sum(x: Int, y: Int): Int { return x + y } fun maxOf(a: Float, b: Float) = if (a > b) a else b }2#字元串插值
這相當於是更智能,更具備可讀性的 Java 的 String.format() 方法的 Kotlin 實現:
3#類型推斷
Kotlin 會自動的對變數的類型進行推斷:
vala = "abc" // type inferred to Stringvalb = 4 // type inferred to Intvalc: Double = 0.7 // type declared explicitlyvald: List = ArrayList() // type declared explicitly4#智能類型轉換
Kotlin 編譯器會跟蹤你的邏輯代碼並在需要的時候進行自動的類型轉換,這意味著我們不需要在顯示轉換時做更多的 instanceof 檢查:
if(objisString) {print(obj.toUpperCase()) // obj is now known to be a String }5#更直觀的相等性比較
你不再需要調用 ,因為 == 操作符也可以用來比較結構的相等性:
val john1 = Person("John") val john2 = Person("John")john1 == john2 // true (structural equality) john1 === john2 // false (referential equality)6#默認參數值
不需要像 Java 那樣定義很多包含不同參數的相似方法:
funbuild(title: String, width: Int = 800, height: Int = 600) { Frame(title, width, height) }7#命名參數
結合默認參數值,命名參數可以消除builders的使用:
build("PacMan", 400, 300) // equivalent build(title = "PacMan", width = 400, height = 300) // equivalent build(width = 400, height = 300, title = "PacMan") // equivalent8#When 表達式
switch 替換成 when ,代碼更具可讀性:
when(x) { 1 ->print("x is 1") 2 ->print("x is 2") 3, 4 ->
print("x is 3 or 4")in5..10 ->print("x is 5, 6, 7, 8, 9, or 10")else->print("x is out of range") }
支持表達式或者是語句,可以是有參數或者無參數:
valres: Boolean =when{ obj ==null-> false objisString -> trueelse->throwIllegalStateException() }9#Properties
可以給公共欄位自定義 set 和 get 行為,這意味著不再會因為那些沒用的getters & setters導致代碼瘋狂膨脹。
10#Data 類
這是一個 POJO 類,包含 , , , 和
11#操作符重載
可以重載預定義的一組操作符來提升代碼的可讀性:
data classVec(valx: Float,valy: Float) {operator funplus(v: Vec) = Vec(x + v.x, y + v.y) }valv = Vec(2f, 3f) + Vec(4f, 1f)12#解構聲明
一些對象是可以解構的,一個很有用的例子就是對 Map 進行迭代:
for((key, value)inmap) {print("Key: $key")print("Value: $value") }13#Ranges
完全為了可讀性:
for(iin1..100) { ... }for(iin0 until 100) { ... }for(iin2..10 step 2) { ... }for(iin10 downTo 1) { ... }if(xin1..10) { ... }14#擴展函數
還記得你第一次用 Java 實現一個 List 的排序嗎?你找不到一個 sort() 函數,然後你就四處求助,最終找到了 .
如果只有一種方法可以向已有的類添加新的函數,這樣 IDE 就可以幫助你在代碼完成時找到正確的函數。在 Kotlin 里你可以這麼做:
funString.replaceSpaces(): String {returnthis.replace( , _ ) }valformatted = str.replaceSpaces()
標準庫擴展了 Java 原來類型的功能,這是字元串對象所需要的:
str.removeSuffix(".txt") str.capitalize() str.substringAfterLast("/") str.replaceAfter(":", "classified")15#Null 安全
Java 是我們應該稱之為是一個幾乎靜態類型的編程語言。Java 的 String 變數類型無法保證它不會等於 null。儘管我們已經習慣了這樣的情況,但它否定了靜態類型檢查的安全性,導致 Java 程序員總是活在各種空指針異常的恐懼中。
Kotlin 通過區分非空類型和允許為空類型來解決這個問題。類型默認是不允許為空的,可以通過在後面加一個 ? 問號來表示允許為空,例如:
vara: String = "abc" a =null// 編譯錯誤varb: String? = "xyz" b =null// 正確
Kotlin 強制你必須在訪問一個可為空的類型變數時候必須確保不會發生空指針:
valx = b.length // 編譯錯誤: b 允許為空
雖然看起來有點麻煩,但這的確是 Kotlin 一個微小卻又非常重要的特性。我們仍可以使用智能的轉換,可以在需要的時候將允許為空的類型轉成不允許為空:
if(b ==null)returnvalx = b.length // 正確
我們也可以使用安全調用方法
valx = b?.length // type of x is nullable Int
安全調用可以鏈接在一起,以避免像其他語言一樣存在大量嵌套的 if-not-null 檢查,如果我們想要一個默認值而不是 null 時,可以用 ?: 操作符:
valname = ship?.captain?.name ?: "unknown"
如果沒有適合你的,那麼你應該是需要一個空指針了,你將不得不顯式的進行處理:
valx = b?.length ?:throwNullPointerException() // same as belowvalx = b!!.length // same as above16#更好的 Lambdas
嘿,帥哥,這是一個很好的 Lambda 系統 —— 在完美的可讀性和簡潔之間取得非常好的平衡,這得益於非常聰明的設計選擇。其語法簡單直接:
valsum = { x: Int, y: Int -> x + y } // type: (Int, Int) -> Intvalres = sum(4,7) // res == 11
優點體現在:
如果 lambda 是方法的最後一個參數或者是唯一參數的話,那麼方法的括弧可以移動或者省略.
如果我們選擇不去聲明單參數的 lambda 表達式的參數,那麼 Kotlin 會隱式的將之命名為 .
numbers.filter({ x -> x.isPrime() }) numbers.filter { x -> x.isPrime() } numbers.filter { it.isPrime() }
這個可以讓你編寫更加簡潔的函數式代碼,就像下面這樣優雅:
persons .filter { it.age >= 18 } .sortedBy { it.name } .map { it.email } .forEach { print(it) }
Kotlin 的 lambda 系統和擴展函數結合,可以非常棒的用來開發各種DSL。例如Anko這個 DSL 的例子可以增強 Android 的開發:
※UI的骨骼?始章
※Gartner:企業重新思考軟體安全戰略
※讀Zepto源碼之操作DOM
※用這4個超實用的方法,做出有價值的功能性動效!
※平面設計的前景好嗎?工資待遇又是如何?
TAG:推酷 |
※我為什麼要從 Python 轉向 Crystal 語言
※好文翻譯丨我為什麼要從 Python 轉向 Crystal 語言
※是什麼讓你從Android轉向iOS?
※傳 iPhone 可能要放棄 Lightning,轉向 USB-C
※Twitter 拋棄 Mesos 轉向 Kubernetes
※Android開發者是時候轉向Kotlin了
※越來越多比特幣支持者不滿Twitter,轉向Mastodon
※報道稱越來越多比特幣支持者不滿Twitter,轉向Mastodon
※獨家 | TensorFlow 2.0將把Eager Execution變為默認執行模式,你該轉向動態計算圖了
※Google 正式關閉 Inbox 郵箱服務,用戶將會轉向 Gmail
※一起聊聊:是什麼讓你從Android轉向iOS?
※Mesos要歇了?Mesosphere更名為D2IQ,業務重心轉向Kubernetes和雲原生
※諜照曝光 iPhone 11 將棄用 Lightning 介面,全面轉向 USB-C
※國內應該能用:谷歌暫停Allo開發將精力轉向開發Android Message
※iPhone或將轉向USB Type-C,希望這是真的
※諜照顯示iPhone 11最終放棄Lightning介面 轉向USB-C
※為了讓果粉轉向AirPods,蘋果決定在今年iPhone中斷然砍掉該產品
※Counterpoint:三星正在轉向一家半導體和系統公司
※Python 即將停止支持Python 2.7,全面轉向 Python 3
※蘋果iPhoneXR降低價格安卓用戶會轉向iPhone手機嗎