instance.let 和 instance 有什么区别?.let

What is the difference between instance.let and instance?.let

两行代码有什么区别:

1.

 viewHolderRef?.get()?.adapterPosition.let {
viewHolderRef?.get()?.adapterPosition?.let

我知道它会影响 lambda 表达式得到的参数类型,但我的意思是不同的是,有没有一种情况,在一个表达式中 let 将 运行 而在第二个表达式中知道(参考null问题)

v?.let的意思是:如果vnull,那么就让整个表达式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")
}

Playground link

这输出:

v.let: null
----------
v.let: foo
v?.let: foo

如您所见,在 null 输出上调用它时,仅 v.let 运行s 并打印 null,而在非空输出上,两个 let 语句 运行。您还可以看到参数类型的差异:v.let 接受 String?,而 v?.let 接受 String.