kotlin有很多种作用域函数,很多文章介绍也大致相同,巧妙的使用这些作用域是区别于JAVA不同的编码方式
下面通过通俗易懂的方式讲解它们的各自用法和差别,如果有说的不对的地方,希望大家加以指正
let
重点 适合带返回值的写法
例如
var state = PowerConnector.getPowerState()?.powerStatus.let {
it
} ?: PowerState.NORMAL
return state
1.如果let块中的最后一条语句如果是非赋值语句,默认情况下它是返回语句,如果不是,则返回的是一个Unit类型~
2.如上面代码,let用于判空检查,如需对非空对象执行操作,可对其使用安全调用操作符,适用于以上判空赋值返回值的场景~
3.let可以将“It”重命名为一个可读的lambda参数
run
重点 run函数以 this 作为上下文对象,且它的调用方式与let一致,另外,当 lambda 表达式同时包含对象初始化和返回值时,run更加适用
val list = listOf("china", "swizerland", "amarica")
val str = StringBuilder().run {
append("go to.\n")
for (fruit in list) {
append(fruit).append("\n")
}
toString()
}
println(str)
with
with属于非扩展函数,同时,它与run做着同样的事情
重点 with使用的是非null的对象,当函数块中不需要返回值时,可以使用with
apply
apply是 T 的扩展函数,与run函数有些相似
重点 apply函数主要用于初始化或更改对象,因为它用于在不使用对象的函数的情况下返回自身
val weatherDetail = WeatherDetail("Beijing").apply {
weather = "sunny"
postcode = 100010
tip = "天气热,注意防暑降温"
}
also
also是 T 的扩展函数,返回值与apply一致,直接返回T。also函数的用法类似于let函数
also作用域内使用it指代调用者。有返回值,返回值为调用者自身
重点 因为T作为block函数的输入,可以使用also来访问属性。所以,在不使用或不改变对象属性的情况下也使用also