gpt4 book ai didi

android - 在 kotlin 中,我应该在 if (data!=null) 和 data?.let 之间使用哪一个?

转载 作者:太空狗 更新时间:2023-10-29 16:10:54 24 4
gpt4 key购买 nike

代码 A 在 java 中很常见。

我还没有完全理解 Kotin 的关键。我应该在 kotlin 的代码 A 和代码 B 之间使用哪一个?谢谢!

代码A

if (data!=null){
initAndBindAdapter()
mCustomAdapter.setSelectedIndex(data.getIntExtra("index",-1))
}

代码B

 data?.let {
initAndBindAdapter()
mCustomAdapter.setSelectedIndex(it.getIntExtra("index",-1))
}

还有,如果 fun do_NoNeed_data_par 不需要数据参数,我应该在 kotlin 的代码 C 和代码 D 之间选择哪个?

代码 C

   if (data!=null){
do_NoNeed_data_par()
}

代码 D

   data?.let {
do_NoNeed_data_par()
}

最佳答案

我(个人观点)认为尽可能使用简单、常规的 null 检查是个好主意,尽管 ?.let 方法已列在主要 Kotlin Idioms 下文档页面(对社区开放以供贡献)- 所以基本上,这将取决于您的个人偏好,即哪一个更具可读性。

更有趣的问题是有什么区别,以及何时可以使用它们:主要区别在于 let 保持变量的值,就像 let 对它的调用开始,let block 中对 it 的任何后续使用都将引用相同的值。如果您对 if 使用简单的 null 检查,则在执行 if block 的主体时,您的变量值可能会更改。

例如,这不会编译,因为 x 可以被多个线程访问,并且当您首先读取它的值进行空检查时它可能是非空的,但它可能当您再次读取 println 参数时变为 null - 这将是不安全的:

class Foo {
var x: Int? = null

fun useX() {
if (x != null) {
println(x + 10) // (...) 'x' is a mutable property that could have been changed by this time
}
}
}

但是,let 将在相同情况下工作,因为它将在整个执行过程中使用 x 的初始值,即使 同时,类中的 x 属性被重新分配:

class Foo {
var x: Int? = null

fun useX() {
x?.let {
println(it + 10)
}
}
}

您可以想到上面的 ?.let 语句基本上执行此操作,创建变量的临时副本:

fun useX() {
val _x = x
if (_x != null) {
println(_x + 10)
}
}

在这个副本上操作是安全的,因为即使 x 属性改变了它的值,这个 _x 副本在整个函数中要么保持为 null,要么是非null 且使用安全。

关于android - 在 kotlin 中,我应该在 if (data!=null) 和 data?.let 之间使用哪一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51093601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com