两行代码之间有什么区别:
1.
viewHolderRef?.get()?.adapterPosition.let {viewHolderRef?.get()?.adapterPosition?.let我知道它可能会影响lambda表达式得到的参数的类型,但我的意思是,在其中一个表达式中let将运行,而在第二个已知中(引用null问题),是否存在这样的情况?
发布于 2020-11-24 13:16:48
v?.let的意思是:如果v是null,那么只需使整个表达式null ( let方法甚至不会被调用,因为它将提前终止),如果它不是null,那么将表达式的类型更改为非空,然后继续使用属性链。因此,v?.let只会在v为非空的情况下调用函数。
相反,v.let将始终调用let,不管v是否为null,因此参数是可空的(因为不能保证它不像v?.let那样为null。这种区别最好用下面的代码来展示:
fun test(v: String?) {
v.let { it: String? -> println("v.let: $it") }
v?.let { it: String -> println("v?.let: $it") }
}
fun main () {
test(null)
println("----------")
test("foo")
}这一产出如下:
v.let: null
----------
v.let: foo
v?.let: foo如您所见,在对null输出调用它时,只有v.let运行并打印null,而对于非空输出,两个let语句都运行。您还可以看到参数类型的不同:v.let接受String?,而v?.let接收String。
https://stackoverflow.com/questions/64986676
复制相似问题