使用Kotlin的“let”的合理情况
在Kotlin中,如果一个对象( let
接收者)不为null
,那么通常使用let
来执行代码,以替代if != null
检查,如下所示:
val nullable: String? = "anything" nullable?.let { println(it) }
在其他情况下,利用let
是否有意义?
仅供参考, let
Kotlin的stdlib,定义如下:
@kotlin.internal.InlineOnly public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
我见过let
用来限制嵌套变量(忽略let
返回):
some.nested.foo.bar.let { bar -> doSomething(bar) doMoreStuff(bar) }
它可以很好,因为它取代了定义一个局部变量的需求,但我不确定它实际上是多么有用。
也可以用apply
来完成,尽管可读性稍差,(而不是范围中的bar
)。
当您使用可为空的var
变量时, let
也很有用。 例如,我们有这个代码
fun doSomething(value: String) { } class A { var boo: String? = null fun b() { if (boo != null) { doSomething(boo) } } }
在那里, if
块内部有编译时错误,因为boo
可以在外面改变。 为了解决这个问题,我们应该创建一个val
变量
class A { var boo: String? = null fun b() { val b = boo if (b != null) { doSomething(b) } } }
或者使用let
class A { var boo: String? = null fun b() { boo?.let { doSomething(it) } } }
- 在Android Studio 3.0布局编辑器中渲染错误
- Kotlin – lateinit VS任何? = null
- java.lang.OutOfMemoryError:pthread_create(1040KB堆栈)失败:请尝试
- 无法使用Android从测试来源访问内部组件
- Kotlin:ArrayIndexOutOfBoundsException在将DispatchTask转换为字符串期间
- 定义null局部变量时需要没有错误,稍后在方法中进行设置
- 如何在Android应用程序中调试“SQL(查询)错误或缺少数据库”?
- Android工作室突然未能解决其他模块的依赖关系
- 未解决的参考:使用greendao和kotlin的DaoSession