Какой из них следует использовать между if (data! = Null) и data? .Let в kotlin? - PullRequest
0 голосов
/ 29 июня 2018

Код А - это обычное использование в Java.

Я не до конца понял ключ от Котина. Какой из них я должен использовать между кодом A и кодом B в kotlin? Спасибо!

Код A

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

Код B

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

И еще, какой из них выбрать между кодом C и кодом D в kotlin, если забавному do_NoNeed_data_par не нужен параметр данных?

Код C

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

Код D

   data?.let {
       do_NoNeed_data_par()    
    }

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Я (личное мнение) думаю, что это хорошая идея - использовать простые, регулярные проверки на ноль, где это возможно, хотя метод ?.let был указан на главной странице документации Kotlin Idioms (которая открыт для участия сообщества) - так что, в основном, это будет зависеть от ваших личных предпочтений, из которых более читабельный.

Более интересный вопрос заключается в том, в чем заключаются различия и когда вы можете использовать каждое из них: основное отличие заключается в том, что let сохраняет значение переменной, как это было, когда начался вызов let для нее, и любое последующее использование it в блоке let будет ссылаться на это же значение. Если вы используете простую нулевую проверку с if, значение вашей переменной может измениться во время выполнения тела блока if.

Так, например, это не скомпилируется, потому что x может быть доступно нескольким потокам, и оно может быть ненулевым, когда вы сначала читаете его значение для проверки на ноль, но оно может стать нулевым к тому времени Вы читаете его снова для параметра 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 останется нулевой для всей этой функции, или она будет ненулевой и безопасной для использования.

0 голосов
/ 29 июня 2018

Иногда использование let() может быть краткой альтернативой для if. Но вы должны использовать это с здравым смыслом, чтобы избежать нечитаемых «крушения поезда». Тем не менее, я действительно хочу, чтобы вы рассмотрели возможность использования let().

val order: Order? = findOrder()
if (order != null){
dun(order.customer)
}

При let() дополнительная переменная не требуется. Итак, мы ладим с одним выражением.

findOrder()?.let { dun(it.customer) }
0 голосов
/ 29 июня 2018

"следует" является самоуверенным. Все зависит от ваших предпочтений.

Если вы предпочитаете более функциональный код стиля, тогда .let - ваш ответ. Если вы предпочитаете более процедурный код, тогда ответом будет == null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...