【问题标题】:What is the difference between instance.let and instance?.letinstance.let 和 instance?.let 有什么区别
【发布时间】:2020-11-24 12:37:47
【问题描述】:

两行代码有什么区别:

1.

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

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

【问题讨论】:

标签: android kotlin lambda nullable let


【解决方案1】:

v?.let 的意思是:如果vnull,那么只需制作整个表达式null(甚至不会调用let 方法,因为它会提前终止),如果它是不是null,然后将表达式的类型更改为不可为空,然后继续使用属性链。所以,v?.let 只会在v 不为空时调用该函数。

相反,v.let总是调用let,无论v 是否为空,因此该参数可以为空(因为不能保证它不为空使用v?.let。这段代码最好地展示了差异:

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 运行并打印null,而在非空输出上,两个let 语句都运行。您还可以看到参数类型的差异:v.let 接受 String?,而 v?.let 接受 String

【讨论】:

  • 空实例是否可以调用let方法?不会导致空指针异常吗?
  • let 是为Any 实现的,其中包括可为空的类型。
  • 谢谢我不知道 Nullable 包含在 Any
  • 能否请您告诉我这里的情况是否不同:(持有人为 ViewHolder)?跨度>
  • leagueNameTextView 属性不可为空,因此不需要空安全属性访问。
猜你喜欢
  • 2022-07-21
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多