Как добавить еще условие для takeIf в kotlin? - PullRequest
1 голос
/ 25 июня 2019

Я знаю, что для проверки

 if(storesList!=null && storesList.isNotEmpty()){
    // do this 
    } else {
  //else do this
    }

мы можем написать так,

storesList?.takeIf { it.isNotEmpty() }.apply {//do this
  }

Как я могу добавить еще условие к этому, я не беру около takeUnless

Ответы [ 3 ]

4 голосов
/ 25 июня 2019

Вы можете добавить оператор Элвиса.

storesList?.takeIf { it.isNotEmpty() }?.apply {
    //it.isNotEmpty() is true
} ?: //it.isNotEmpty() is false

Поэтому, если it.isNotEmpty() имеет значение true, takeIf возвращает ненулевое значение и будет вызываться блок применения.

Если false, выражение равно нулю, и оператор elvis выполнит выражение, стоящее за ним.Оператор elvis похож на оператор if (expression before == null) -> execute после оператора elvis.

Для получения дополнительной информации посмотрите документы: https://kotlinlang.org/docs/reference/null-safety.html#elvis-operator

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

По-котлински, вы можете использовать оператор безопасного вызова ('? '), чтобы выполнять операции над объектами, которые могут быть обнулены, без сбоев или даже делать это внутри блока if (obj!=null).

Итак, некоторый объект, такой как

if (someObj != null )
    someObj.someOperation() //just doing some operation

- это то же самое, вызывая как: someObj?.someOperation().


Итак, если вы хотите проверить пустоту списка без условие if-else , вы можете использовать, как показано ниже (что вы уже сделали) .

storesList?.takeIf { it.isNotEmpty() }?.apply { 
    // Provides you list if not empty
}

Но как насчет условия здесь?

Для этого вы можете использовать оператор Элвиса для выполнения условия.Этот оператор делает, если левая сторона операции равна нулю или не удовлетворяет определенному условию, а затем принимает правую сторону операнда.

Итак, конечный код должен выглядеть следующим образом:

storesList?.takeIf { it.isNotEmpty() }?.apply { 
// Provides you list if not empty
} ?: run {
// Else condition here
}

Объяснение: если storesList равно пусто или равно нулю оно переходит к другой части (то есть после elvis) в противном случае переходит к применить блок .

2 голосов
/ 25 июня 2019

Используйте Elvis Operator

например. a ?: b // here if a is not null value =a else value= b

в вашем случае -

storesList?.takeIf { it.isNotEmpty() }?.apply {
    //it.isNotEmpty() is true
} ?: run{} //`else condition goes here`

для дополнительной проверки здесь - https://en.wikipedia.org/wiki/Elvis_operator

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