为什么在kotlin的null安全操作中使用let



我听说,当您希望使用安全调用运算符?.对对象执行null安全操作时,会使用let。(据此(但问题是为什么这样:

fun main() {
var s: String? = null
s = s?.let{ it.toUpperCase() }
println(s)
}

优先于此:

fun main() {
var s: String? = null
s = s?.toUpperCase() 
println(s)
}

在我看来,第二个变体更容易阅读和理解,这使得变得无用。

那么let函数的目的是什么呢?

?.let()并不比简单的?.toUpperCase()更受欢迎。但我们不能总是使用后者,最重要的是,我们经常需要调用另一个对象的函数:

s?.let { parse(it) }
file?.let { FileInputStream(it) }

此外,我个人有时更喜欢?.let(),如果有一个长的调用链,并且null只存在于它的开头。我觉得?.let()在代码清晰度方面更好:

post?.let { it.author.personalInfo.address.street }

代替:

post?.author?.personalInfo?.address?.street