kotlin избегая глубокого вложения `let` inside` let` - PullRequest
0 голосов
/ 29 января 2020

Есть ли способ избежать следующих конструкций? Способ проверить нулевое значение без добавления намерения к коду? Я имею в виду, как if (variableOne == null) return, но в классном и классном стиле Колтин?

variableOne?.let{
    // ....

    variableTwo?.let {
        // ...

        variableThree?.let {
            // ...

        }
    }
}

Ответы [ 4 ]

1 голос
/ 29 января 2020

Используйте локальные переменные и умное приведение.

val lVariable1 = variable1
val lVariable2 = variable2
val lVariable3 = variable3
if (lVariable1 != null &&
        lVariable2 != null &&
        lVariable3 != null) {
    // Use local variables here
}
0 голосов
/ 29 января 2020

Использовать старую if statements, рекомендуется для основных kotlin членов команды , поэтому в вашем случае

if(variableOne != null && variableTwo != null && variableThree != null){
    //Do something
}

Ниже приведен соответствующий текст из Kotlin в действии

Когда вам нужно проверить несколько значений на NULL, вы можете использовать вложенные вызовы let для их обработки. Но в большинстве случаев такой код оказывается довольно многословным и трудным для понимания. Обычно проще использовать регулярное выражение if для проверки всех значений вместе.

0 голосов
/ 29 января 2020

Вы можете попробовать связать их так:

variableOne?.let {
    /* "it" refers to variableOne, 
       do some stuff with it */

    variableTwo
}?.let {
    /* "it" refers to variableTwo,
       do some stuff with it */

    variableThree
}?.let {
    /* "it" refers to variableThree,
       do some stuff with it  */
}
0 голосов
/ 29 января 2020

Нет, удивительный способ отсутствует (пока функции с несколькими получателями не будут добавлены в Kotlin). Есть два варианта, чтобы избежать этого ада обратного вызова:

  1. Использовать if (variableOne == null) return операторов.

  2. Создать вспомогательную функцию, подобную этой:

fun <A : Any, B : Any, C : Any> runIfNotNull(a: A?, b: B?, c: C?, block: (A, B, C) -> 
Unit) {
    if (a != null && b != null && c != null) block(a, b, c)
}

Таким образом, вы можете использовать его следующим образом:

runIfNotNull(nullableOne, nullableTwo, nullableThree) { notNullOne, notNullTwo, notNullThree ->
    doSomething(notNullOne, notNullTwo, notNullThree)
}

И вам придется создавать аналогичные функции для каждого количества аргументов, которые вам понадобятся.

...