以下內(nèi)容全部來自郭霖的《第一行代碼》橘沥。
1
在一個水果集合里找到單詞最長的那個水果窗轩,初步寫法。
var list = listOf("Apple", "Banana", "Oriange", "Pear", "Grape", "Watermelon")
var maxLengthFruit = ""
for(fruit in list){
if(fruit.length > maxLengthFruit.length){
maxLengthFruit = fruit.length
}
}
Log.i("_like", "maxLengthFruit is $maxLengthFruit")//Watermelon
優(yōu)化1:使用maxByOrNull函數(shù)座咆,maxByOrNull工作原理是根據(jù)我們傳入的條件來遍歷集合痢艺,從而找到該條件下的最大值。
val list = listOf("Apple", "Banana", "Oriange", "Pear", "Grape", "Watermelon")
val lambda = {fruit:String->fruit.length}
val maxLengthFruit = list.maxByOrNull(lambda)
Log.i("_like", "maxLengthFruit is $maxLengthFruit")//Watermelon
優(yōu)化2:去掉Lambda變量介陶。
val list = listOf("Apple", "Banana", "Oriange", "Pear", "Grape", "Watermelon")
val maxLengthFruit = list.maxByOrNull({fruit:String->fruit.length})
Log.i("_like", "maxLengthFruit is $maxLengthFruit")//Watermelon
優(yōu)化3:Kotlin規(guī)定:當(dāng)Lambda參數(shù)是函數(shù)的最后一個參數(shù)時(shí)堤舒,可以將Lambda表達(dá)式移到函數(shù)的括號外面。
val list = listOf("Apple", "Banana", "Oriange", "Pear", "Grape", "Watermelon")
val maxLengthFruit = list.maxByOrNull(){fruit:String->fruit.length}
Log.i("_like", "maxLengthFruit is $maxLengthFruit")//Watermelon
優(yōu)化4:如果Lambda參數(shù)是函數(shù)的唯一一個參數(shù)的話哺呜,還可以將參數(shù)的括號省略舌缤。
val list = listOf("Apple", "Banana", "Oriange", "Pear", "Grape", "Watermelon")
val maxLengthFruit = list.maxByOrNull{fruit:String->fruit.length}
Log.i("_like", "maxLengthFruit is $maxLengthFruit")//Watermelon
優(yōu)化5:kotlin有出色的類型推導(dǎo)機(jī)制,Lambda表達(dá)式中參數(shù)列表大多數(shù)情況下不必聲明參數(shù)類型某残。
val list = listOf("Apple", "Banana", "Oriange", "Pear", "Grape", "Watermelon")
val maxLengthFruit = list.maxByOrNull{fruit->fruit.length}
Log.i("_like", "maxLengthFruit is $maxLengthFruit")//Watermelon
優(yōu)化6:當(dāng)Lambda表達(dá)式的參數(shù)列表中只有一個參數(shù)時(shí)国撵,也不必聲明參數(shù)名,可以使用it關(guān)鍵字來代替驾锰。
val list = listOf("Apple", "Banana", "Oriange", "Pear", "Grape", "Watermelon")
val maxLengthFruit = list.maxByOrNull{it.length}
Log.i("_like", "maxLengthFruit is $maxLengthFruit")//Watermelon
2
同理優(yōu)化Java函數(shù)式API卸留。
在kotlin中調(diào)用一個Java方法,并且該方法接受一個Java單抽象方法接口參數(shù)椭豫,就可以使用函數(shù)式API耻瑟。Java單抽象接口指的是接口中只有一個待實(shí)現(xiàn)方法。如Runnable接口赏酥,只有一個待實(shí)現(xiàn)的run()方法喳整。
Java:
new Thread(new Runnable(){
@Override
public void run(){
...
}
}.start();
Kotlin:
Thread(object:Runnable {
override fun run(){
...
}
}).start()
由于Kotlin完全舍棄了new關(guān)鍵字,因此創(chuàng)建匿名類實(shí)例的時(shí)候就不能在使用new了裸扶,而是改用了object關(guān)鍵字框都。
優(yōu)化1:Runnable類中只有一個待實(shí)現(xiàn)的方法,所及即使沒有顯式地重寫run()方法呵晨,Kotlin也能自動明白Runnable后面的Lambda表達(dá)式就是要在run()方法中實(shí)現(xiàn)的內(nèi)容魏保。
Thread(Runnable {
...
}).start()
優(yōu)化2:一個Java參數(shù)列表中有且僅有一個Java單抽象方法接口參數(shù)熬尺,我們還可以將接口名進(jìn)行省略。
Thread({
Log.i("_like", "run")
}).start()
優(yōu)化3:當(dāng)Lambda表達(dá)式是方法的最后一個參數(shù)時(shí)谓罗,可以將Lambda移到方法括號的外面粱哼。同時(shí),如果Lambda表達(dá)式還是方法的唯一參數(shù)檩咱,還可以將方法的括號省略揭措。
Thread{...}.start()
由于Android SDK還是用Java編寫的,當(dāng)用Kotlin調(diào)用這些SDK接口時(shí)刻蚯,就很可能用到這種Java函數(shù)式API寫法绊含。例如,使用Kotlin為一個Button按鈕編寫點(diǎn)擊事件可簡化為:button.setOnClickListener { ... }