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