Q: Идиоматический c способ проверить, не имеет ли какая-либо переменная значение NULL в Kotlin - PullRequest
1 голос
/ 02 августа 2020

Предположим, у меня есть код Kotlin вроде этого:

val var1:String? = isVar1Present() 
val var2:String? = isVar2Present()
val var3:String? = isVar3Present()

   
if ((var1!=null)||(var2!=null)||(var3!=null)) {
//do something complex only if at least one of var is not null and do it only one time
}

Как сделать его более идеоматичным c в Kotlin? Если бы это был один var - это было бы просто var1?.let { ... } , но у меня их здесь 3.

Я тоже думал о

    if (listOf(var1, var2, var3)
            .filterNotNull()
            .isNotEmpty( ) { 
                //do something complex 
             }

, но это выглядит довольно безумно (но коротко, особенно что в реальном коде это не isVarNPresent, а довольно длинная строка, например isVar1Present=varmanager.getStatusOfVar(varmanager.var1) (поэтому в приведенном выше примере будет использоваться дополнительный шаг карты)

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Есть немного более короткая версия:

if (var1 ?: var2 ?: var3 != null) { … }

(Это работает, потому что var1 ?: var2 ?: var3 дает первое найденное ненулевое значение или null, только если все три переменные равны null.)

Это немного короче и, возможно, немного больше идиоматики c, но немного менее очевидно, особенно для не- Kotlin -экспертов. В зависимости от того, кто может прочитать код, возможно, стоит придерживаться более простой и понятной версии (с удаленными скобками, как предлагает Anime sh):

if (var1 != null || var2 != null || var3 != null) { … }

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

(var1 ?: var2 ?: var3)?.let { … }

В этом случае альтернатива less-idiomati c будет намного длиннее, поэтому конструкция более оправдана.

1 голос
/ 03 августа 2020

Для операции со списком я бы написал как

listOf(var1, var2, var3).any { it != null }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...