Упростить тестирование пустой переменной в выражении IF - PullRequest
1 голос
/ 24 июня 2019

В Kotlin у меня есть это (которое не будет компилироваться):

var list: MutableList<String>? = null

if (list.isNotEmpty()) {

}

Это скомпилирует:

var list: MutableList<String>? = null

if (list!!.isNotEmpty()) {

}

Однако, если list равен null, возникнет исключение времени выполнения. Я мог бы сделать это:

var list: MutableList<String>? = null

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

}

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

Ответы [ 4 ]

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

В конкретном случае проверки, если список не нулевой или пустой, вы можете использовать:

if (!list.isNullOrEmpty())
1 голос
/ 25 июня 2019

Для списка лучше избегать обработки нулевого состояния, а обрабатывать только пустое и непустое состояние.см. http://thefinestartist.com/effective-java/43.

Сказав это, нам не нужно явно проверять наличие нулевой проверки, и только пустая проверка должна делать свое дело.

var list : MutableList<String> = mutableListOf()
list.add("Test1")
list.takeIf { it.isNotEmpty() }?.forEach { println(it) }

Мы можем использовать

takeIf

, чтобы проверить, является ли список пустым или нет.

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

Я думаю, что большинство можно сделать с помощью safe operator ?.. Поэтому, если вы просто хотите перебрать список (или reduce, map, или что-то еще), вы можете просто сделать это напрямую:

val sumExpression = list?.joinToString("+") { it.someValue } ?: throw exception? use default value?
list?.forEach { println("an entry in the list: $it") } // if there are entries, just iterate over them... if not, there is nothing to do
list?.also {
   consume(it) // consume now is only called if the list is not null
}

Улучшить его с помощью условия также довольно просто с помощью takeIf или takeUnless (в зависимости от того, что вам требуется):

list?.takeIf { it.isNotEmpty() }

Теперь у вас все еще есть список, который можно обнулять, и вы можете снова вызвать любую из желаемых функций, как показано ранее:

list?.takeIf( it.isNotEmpty() }?.also {
  consume(it)
}

Также вариант вместо list.isNullOrEmpty() (уже показанный gpuntos answer ) заключается в сравнении возможного нулевого значения с ожидаемым результатом, например ::

if(list?.isNotEmpty() == true) {
  // do something with the non-empty list
}

В случае null условие упрощается до null == true, что составляет false. Однако я бы не стал слишком злоупотреблять этим, так как тогда вы уже не сможете легко увидеть настоящие обнуляемые типы. Такое использование может иметь смысл, если то, что вы пытаетесь вычислить, еще не поддерживается в его собственной функции расширения (как в случае isNullOrEmpty()), например для ввода if, только если count равно 4, имеет смысл использовать что-то вроде: if (list?.count() == 4) ...

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

Первый способ добавить эту строку

list = list?:MutableList<String>()

Второй способ

val isEmpty = list.isEmpty()?:false

if(isEmpty){}else{}

Третий способ

if (!list.isNullOrEmpty()) 

, как предложил @AndroidDev

Почему получаю ошибку?Так как !! требует ненулевое значение.если объект нулевой, то он выдаст NPE

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