代码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))
}
还有更多,如果有趣的do_NoNeed_data_par不需要数据参数,我应该在kotlin的Code C和Code D之间选择哪个?
代码C
if (data!=null){
do_NoNeed_data_par()
}
代码D
data?.let {
do_NoNeed_data_par()
}
答案 0 :(得分:6)
我(个人意见)认为,尽管在文档的Kotlin主要Idioms页下列出了?.let
方法(该方法{是开放的,可供社区做出贡献)-因此,基本上,这取决于您的个人喜好(更容易理解)。
更有趣的问题是,有什么区别,以及何时可以使用它们:主要区别是let
保留变量的值,就像let
调用时一样它开始,并且it
块内let
的任何后续使用都将引用相同的值。如果对if
使用简单的null检查,则在执行if
块的主体时,变量的值可能会更改。
例如,它不会编译,因为x
可以被多个线程访问,当您首先为null检查读取它的值时,它可能为非null,但是到了您再次读取println
参数的时间-这是不安全的:
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,并且可以安全使用。
答案 1 :(得分:0)
“应该” 被接受。这完全取决于您的喜好。
如果您希望使用更多的功能样式代码,则可以使用.let
。如果您希望使用更多程序代码,那么== null
是您的答案。
答案 2 :(得分:0)
有时,使用let()
可以替代if
。但是您必须结合合理的判断来使用它,以避免产生难以理解的“火车残骸”。不过,我真的希望您考虑使用let()
。
val order: Order? = findOrder()
if (order != null){
dun(order.customer)
}
使用let()
,不需要额外的变量。所以我们相处一个表达式。
findOrder()?.let { dun(it.customer) }