Gibt es eine Möglichkeit, mehrere Lets für mehrere nullfähige Variablen in Kotlin zu verketten?
fun example(first: String?, second: String?) {
first?.let {
second?.let {
// Do something just if both are != null
}
}
}
Ich meine, so etwas:
fun example(first: String?, second: String?) {
first?.let && second?.let {
// Do something just if both are != null
}
}
Antworten:
Bei Interesse sind hier zwei meiner Funktionen zur Lösung dieses Problems.
Verwendung:
quelle
Hier sind einige Variationen, je nachdem, welchen Stil Sie verwenden möchten, ob Sie alle gleichen oder unterschiedlichen Typen haben und ob die Liste eine unbekannte Anzahl von Elementen enthält ...
Gemischte Typen, alle dürfen nicht null sein, um einen neuen Wert zu berechnen
Für gemischte Typen können Sie eine Reihe von Funktionen für jede Parameteranzahl erstellen, die zwar albern aussehen, für gemischte Typen jedoch gut funktionieren:
Anwendungsbeispiel:
Führen Sie einen Codeblock aus, wenn die Liste keine Nullelemente enthält
Hier zwei Varianten: erstens das Ausführen eines Codeblocks, wenn eine Liste alle Nicht-Null-Elemente enthält, und zweitens, wenn eine Liste mindestens ein Nicht-Null-Element enthält. In beiden Fällen wird eine Liste von Nicht-Null-Elementen an den Codeblock übergeben:
Funktionen:
Anwendungsbeispiel:
Eine geringfügige Änderung, damit die Funktion die Liste der Elemente empfängt und dieselben Vorgänge ausführt:
Anwendungsbeispiel:
Diese Variationen könnten geändert werden, um Rückgabewerte wie zu haben
let()
.Verwenden Sie das erste Nicht-Null-Element (Coalesce).
Geben Sie ähnlich wie bei einer SQL Coalesce-Funktion das erste Nicht-Null-Element zurück. Zwei Varianten der Funktion:
Anwendungsbeispiel:
Andere Variationen
... Es gibt andere Variationen, aber mit einer genaueren Spezifikation könnte dies eingegrenzt werden.
quelle
whenAllNotNull
Destrukturierung kombinieren :listOf(a, b, c).whenAllNotNull { (d, e, f) -> println("$d $e $f")
.Sie können dafür Ihre eigene Funktion schreiben:
quelle
Sie können eine
arrayIfNoNulls
Funktion erstellen :Sie können es dann für eine variable Anzahl von Werten verwenden mit
let
:Wenn Sie bereits ein Array haben, können Sie eine
takeIfNoNulls
Funktion erstellen (inspiriert vontakeIf
undrequireNoNulls
):Beispiel:
quelle
Für den Fall, nur zwei Werte zu überprüfen und auch nicht mit Listen arbeiten zu müssen:
Anwendungsbeispiel:
quelle
Eigentlich kannst du das einfach machen, weißt du? ;)
Es ist nichts Falsches daran, einen normalen Null-Check in Kotlin zu verwenden.
Und es ist weitaus besser lesbar für alle, die sich Ihren Code ansehen.
quelle
let
Abkürzung für diese Überprüfungen bietetIch ziehe es eigentlich vor, es mit den folgenden Hilfsfunktionen zu lösen:
Und so sollten Sie sie verwenden:
quelle
Ich habe dieses Problem gelöst, indem ich einige Funktionen erstellt habe, die das Verhalten von with mehr oder weniger replizieren, aber mehrere Parameter verwenden und nur die Funktion aller Parameter aufrufen, die nicht null ist.
Dann benutze ich es so:
Das offensichtliche Problem dabei ist, dass ich für jeden Fall (Anzahl der Variablen), die ich benötige, eine Funktion definieren muss, aber zumindest denke ich, dass der Code sauber aussieht, wenn ich sie verwende.
quelle
Sie könnten dies auch tun
quelle
Ich habe die erwartete Antwort ein wenig aktualisiert:
das macht dies möglich:
quelle
Für eine beliebige Anzahl von zu überprüfenden Werten können Sie Folgendes verwenden:
Und es wird so verwendet:
Die an den Block gesendeten Elemente verwenden den Platzhalter. Sie müssen die Typen überprüfen, wenn Sie auf die Werte zugreifen möchten. Wenn Sie nur einen Typ verwenden müssen, können Sie dies zu Generika mutieren
quelle