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

时间:2018-06-29 02:51:03

标签: android kotlin

代码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()    
    }

3 个答案:

答案 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) }