Проверка члена объекта на null перед выполнением блока IF - PullRequest
0 голосов
/ 24 июня 2019

У меня есть следующий код:

class Countries {
    var list: MutableList<String>? = null
}

val countries = Countries()

if (countries.list!!.isNotEmpty()) {

}

Во время выполнения это вызовет исключение, потому что список пуст.Вместо этого я могу сделать это:

if ((countries.list != null) && countries.list!!.isNotEmpty()) {

}

Если бы у меня был логический член с именем areInitialized, который мог иметь значение null, я мог бы создать инфиксную функцию, например:

infix fun Any?.ifTrue(block: () -> Unit) {
    if ((this != null) && this == true) block()
}

, а затем использовать ее какthis:

countries.areInitialized ifTrue {

}

Но я не могу создать что-то похожее для изменяемого списка.

Но я ненавижу повторять этот тест для нуля в поле члена в других частяхкод.Есть ли в Котлине более простой способ сделать это?

1 Ответ

0 голосов
/ 24 июня 2019

Я бы старался придерживаться стандарта как можно чаще.Так что в вашем примере я бы не представил эту ifTrue -функцию, а использовал бы takeIf или takeUnless в сочетании с оператором безопасной ?. вместо этого, например:

countries?.takeIf { it.areInitialized == true }
         ?.also { 
             /* do something with countries */ 
         }

Или, если необходимо вернуть значение, замените also на let (или посмотрите другие функции области действия ).

То же самое также работает для списка в countries:

countries?.takeUnless { it.list.isNullOrEmpty() }
         ?.also { 
             /* do something with countries */ 
             it.list!!.forEach(::println)
         }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...