Kotlin編程實踐7章 作用域函數let/run/apply/also

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章