💂 個(gè)人網(wǎng)站:【 海擁 】【 摸魚小游戲 】 🤟 風(fēng)趣幽默的人工智能學(xué)習(xí)網(wǎng)站:👉人工智能 💅 想尋找共同學(xué)習(xí)交流的小伙伴,請(qǐng)點(diǎn)擊【全棧技術(shù)交流群 】 💬 免費(fèi)且實(shí)用的計(jì)算機(jī)相關(guān)知識(shí)題庫(kù):👉進(jìn)來(lái)逛逛
給大家安利一個(gè)免費(fèi)且實(shí)用的計(jì)算機(jī)知識(shí)刷題(面經(jīng)大全)網(wǎng)站,👉點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站 ,。
Kotlin 之于 Java 就像 ES6 之于舊式 JavaScript。很多人都被 JavaScript 引擎(如瀏覽器)或 JVM(如 Android)所困,。他們的母語(yǔ)很糟糕,但是使用完全非母語(yǔ)的語(yǔ)言會(huì)導(dǎo)致與本地 API 交互的巨大復(fù)雜性,。于是就創(chuàng)建了折衷的解決方案,比如用于 JavaScript 的 ES6 和用于 Java 的 Kotlin。Kotlin 在 Android 開發(fā)人員中特別受歡迎,但你可以在任何可以使用 JVM 的地方使用它,而且現(xiàn)在真的很難找到使用“純 Java”的正當(dāng)理由,。
Hello, World
我們可以從最基本的程序開始!這沒什么不尋常的,除非你記得它在普通 Java 中有多糟糕:
fun main ( ) {
println ( "Hello, World!" )
}
對(duì)于一個(gè)合理的 hello world,整個(gè)事件花費(fèi)的時(shí)間太長(zhǎng)了:
$ kotlinc hello. kt - include- runtime - d hello. jar && java - jar hello. jar
Kotlin 有某種“腳本模式”和 REPL,它可以與你的 IDE 集成,所以對(duì)于每天編寫它的人來(lái)說(shuō),這可能不是問(wèn)題,。
我在代碼庫(kù)中包含了一個(gè)允許 ./run file.kt
的簡(jiǎn)短腳本。
斐波那契
我們需要一些類型注釋,感覺它們應(yīng)該是可推斷的,但它們都是完全合理的代碼,。范圍循環(huán)語(yǔ)法是完全可讀的,總體而言,考慮到它基本上是 Java 底層,它的可讀性和簡(jiǎn)潔的代碼令人震驚,。
fun fib ( n: Int) : Int {
if ( n < 3 ) {
return 1
} else {
return fib ( n - 1 ) + fib ( n - 2 )
}
}
fun main ( ) {
for ( i in 1 .. 30 ) {
println ( fib ( i) )
}
}
FizzBuzz
Kotlin 拋棄了 C 風(fēng)格 switch
,引入了 when
語(yǔ)法,這有點(diǎn)類似于 Haskell 風(fēng)格的模式匹配。
fun fizzbuzz ( n: Int) : String {
return when {
n % 15 == 0 -> "FizzBuzz"
n % 3 == 0 -> "Fizz"
n % 5 == 0 -> "Buzz"
else -> n. toString ( )
}
}
fun main ( ) {
for ( i in 1 .. 100 ) {
println ( fizzbuzz ( i) )
}
}
統(tǒng)一碼
由于 Kotlin 在底層基本上就是 Java,它仍然不能在基本平面之外正確處理 Unicode,所以最后一個(gè)答案是錯(cuò)誤的:
fun main ( ) {
println ( "Hello" . length)
println ( "?ó?w" . length)
println ( "💩" . length)
}
輸出
5
4
2
數(shù)據(jù)類
Java 使得處理幾乎任何類型的數(shù)據(jù)都變得非常乏味,。每個(gè)簡(jiǎn)單的數(shù)據(jù)類都需要顯式的構(gòu)造函數(shù),、getter、setter,、hashcode 和 equals,。你甚至不能使用==
, 你需要運(yùn)行.equals()
,但如果其中一方為空,那將真的崩潰,所以你需要先對(duì)雙方進(jìn)行空檢查,然后.equals()
?;緮?shù)據(jù)操作的樣板數(shù)量太荒謬了,。
Kotlin 避免了幾乎所有這些廢話:
data class Point ( val x: Double, val y: Double) {
fun length ( ) = Math. sqrt ( x * x + y * y)
}
fun main ( ) {
val a = listOf ( 1 , 2 , 3 )
val b = listOf ( 1 , 2 , 3 )
val c = Point ( 30.0 , 40.0 )
val d = Point ( 30.0 , 40.0 )
println ( a == b)
println ( c == d)
println ( null == d)
println ( "len of ${ c } is ${ c. length ( ) } " )
}
輸出
true
true
false
len of Point ( x= 30.0 , y= 40.0 ) is 50.0
我們?nèi)匀恍枰褂?code>listOf(1, 2, 3)而不是[1, 2, 3]
,如果我們嘗試了它會(huì)抱 Point(30, 40),但這還不錯(cuò)。
函數(shù)式編程
我們?nèi)绾卧?Kotlin 中執(zhí)行 map
,、filter
和 reduce
?它看起來(lái)像帶有{ arguments -> ... }
塊的 Ruby,。有趣的是,如果您傳遞一個(gè)不帶任何參數(shù)的塊,它會(huì)將其視為具有默認(rèn)值 { it -> ... }
。 這是一個(gè)罕見的特性,在 Perl 中最為顯著,它被稱為更神秘的 $_
,。
fun main ( ) {
val alist = listOf ( 1 , 2 , 3 , 4 , 5 )
println ( alist. map { x -> x * 2 } )
println ( alist. map { it * 2 } )
println ( alist. filter { it % 2 == 1 } )
println ( alist. reduce { a, b -> a + b } )
}
輸出
[ 2 , 4 , 6 , 8 , 10 ]
[ 2 , 4 , 6 , 8 , 10 ]
[ 1 , 3 , 5 ]
15
你應(yīng)該使用 Java 嗎
通常我會(huì)問(wèn)“你應(yīng)該使用 Kotlin 嗎”,但那是在向后看,。真正的問(wèn)題是“你應(yīng)該使用 Java”嗎?答案是明確而明確的 NO!如果你需要在 JVM 上運(yùn)行某些東西并與“Java”生態(tài)系統(tǒng)交互,那么你可以做到這一點(diǎn),而無(wú)需觸及語(yǔ)言的那個(gè)可悲的借口。Kotlin 之于 Java 就像 ES6 之于舊式 JavaScript 一樣,但這里的改進(jìn)要大得多,。舊式 JavaScript 已經(jīng)死了,完全被 ES6+ JavaScript 取代,這也是 Java 的命運(yùn),。
還有其他 JVM 語(yǔ)言,如 JRuby、Clojure,、Scala 等,但它們本質(zhì)上是不同的語(yǔ)言,具有不同的語(yǔ)義和不同的互操作性故事,。Kotlin 只是固定 Java,僅此而已。