let、run、apply、also
1、使用apply函數(shù)在構(gòu)造結(jié)束后初始化對象
apply的接收者與返回值是同一個(gè)對象,該函數(shù)使用它的接收者調(diào)用給定代碼塊,并在執(zhí)行完后將其返回。
最常用于對已經(jīng)實(shí)例化的對象進(jìn)行額外的配置。
2、使用also函數(shù)進(jìn)行其他操作
also 接收者在執(zhí)行block參數(shù)后返回,最常用于將函數(shù)調(diào)用鏈接到對象上。
val block = createBook()
.also{println(it)}
.also{Logger.getAnonymousLogger().info(it.toString())}
在block內(nèi)部使用it引用該對象。
also返回了上下文。
3、使用let函數(shù)與Elvis
let返回block的結(jié)果而不是上下文對象!因此更像是一個(gè)上下文對象轉(zhuǎn)換器。
如:將字符串內(nèi)容轉(zhuǎn)大寫并特殊處理
fun processString(str:String) =
str.let{
when{
it.isEmpty() ->"Empty"
it.isBlank() ->"Blank"
else -> it.capitalize()
}
}
當(dāng)參數(shù)是可空時(shí)候:
fun processString(str:String?) =
str?.let{
when{
it.isEmpty() ->"Empty"
it.isBlank() ->"Blank"
else -> it.capitalize()
}
}?:"Null"
組合使用安全調(diào)用操作符?.、let函數(shù)、以及?:可以輕松處理所用情況,這時(shí)kotlin慣用語法,因?yàn)樗梢宰屇爿p松處理空余非空兩種情況。
4、使用let函數(shù)代替臨時(shí)變量
如一個(gè)可變字符串列表,然后將它映射到他們的長度并過濾結(jié)果
val numbers = mutableListOf("one","two","three","four","five")
val resList = numbers.map{it.length}.filter{it>3}
println(resList)
使用let重構(gòu)后
val numbers = mutableListOf("one","two","three","four","five")
numbers.map{it.length}.filter{it>3}.let{
println(resList)
//更多操作。
}
上面不是將結(jié)果賦值給臨時(shí)變量,因此可以在塊中打印或更多操作。
如果只是打印,則可簡化為:
val numbers = mutableListOf("one","two","three","four","five")
numbers.map{it.length}.filter{it>3}.let(::println)