Idiomatische Art der Handhabung Nullable oder leere Liste in Kotlin

10

Angenommen, ich habe eine Variable activities vom Typ List<Any>? . Wenn die Liste nicht null und nicht leer ist, möchte ich etwas tun, sonst möchte ich etwas anderes machen. Ich habe folgende Lösung gefunden:

%Vor%

Gibt es einen idiomatischen Weg, dies in Kotlin zu tun?

    
Kirill Rakhman 13.10.2014, 13:31
quelle

5 Antworten

11

Für einige einfache Aktionen können Sie den sicheren Aufrufoperator verwenden, vorausgesetzt, die Aktion beachtet auch, dass sie nicht auf einer leeren Liste operiert (um Ihren Fall von sowohl null als auch leer zu behandeln:

) %Vor%

Für andere Aktionen. Sie können eine Erweiterungsfunktion schreiben - zwei Varianten, abhängig davon, ob Sie die Liste als this oder als Parameter erhalten möchten:

%Vor%

Was Sie verwenden können als:

%Vor%

Sie können auch eine umgekehrte Funktion ausführen:

%Vor%

Ich würde vermeiden, diese zu verketten, weil Sie dann eine if oder when Anweisung durch etwas wortreicheres ersetzen. Und Sie kommen mehr in den Bereich, den die Alternativen, die ich unten erwähne, liefern, die für Erfolg / Misserfolg-Situationen voll verzweigen.

Hinweis: Diese Erweiterungen wurden für alle Nachkommen von Collections mit Nicht-Null-Werten verallgemeinert. Und arbeite für mehr als nur Listen.

Alternativen:

Die Ergebnis -Bibliothek für Kotlin bietet eine gute Möglichkeit, Ihren Fall von "do this oder that" basierend auf der Antwort zu behandeln Werte. Für Versprechen finden Sie das gleiche in der Kovenant Bibliothek.

Beide Bibliotheken geben Ihnen die Möglichkeit, alternative Ergebnisse von einer einzelnen Funktion zurückzugeben und den Code basierend auf den Ergebnissen zu verzweigen. Sie verlangen, dass Sie den Anbieter der "Antwort" kontrollieren, auf die reagiert wird.

Dies sind gute Kotlin Alternativen zu Optional und Maybe .

Erkunden der Erweiterung Funktionen (und vielleicht zu viel)

Dieser Abschnitt soll nur zeigen, dass Sie, wenn Sie ein Problem wie die hier aufgeworfene Frage lösen, in Kotlin viele Antworten finden können, um das Codieren so zu gestalten, wie Sie es wollen. Wenn die Welt nicht sympathisch ist, ändere die Welt. Es ist nicht als gute oder schlechte Antwort gedacht, sondern eher als zusätzliche Information.

Wenn Sie die Erweiterungsfunktionen mögen und in Betracht ziehen möchten, sie in einem Ausdruck zu verketten, würde ich sie wahrscheinlich wie folgt ändern ...

Die withXyz Flavors zur Rückgabe von this und whenXyz sollten einen neuen Typ zurückgeben, der es ermöglicht, dass die gesamte Sammlung zu einer neuen wird (vielleicht sogar unabhängig vom Original). Daraus ergibt sich folgender Code:

%Vor%

Hinweis: Der vollständige Code für diese Version befindet sich am Ende des Posts (1)

Aber Sie könnten auch eine völlig neue Richtung mit einem benutzerdefinierten "this other that" -Mechanismus gehen:

%Vor%

Es gibt keine Grenzen, sei kreativ und lerne die Macht von Erweiterungen, probiere neue Ideen aus, und wie du sehen kannst, gibt es viele Variationen, wie Menschen diese Art von Situationen kodieren wollen. Die stdlib kann 8 Variationen dieser Art von Methoden nicht unterstützen, ohne zu verwirren. Jede Entwicklungsgruppe kann jedoch Erweiterungen haben, die ihrem Codierungsstil entsprechen.

Hinweis: Der vollständige Code für diese Version befindet sich am Ende des Posts (2)

Beispielcode 1: Hier ist der vollständige Code für die "verkettete" Version:

%Vor%

Beispielcode 2: Hier ist der vollständige Code für eine Bibliothek "this sonst that that" (mit Komponententest):

%Vor%     
Jayson Minard 28.12.2015, 18:37
quelle
8

versuche das! sehr klar.

%Vor%     
tiiime 02.01.2018 06:26
quelle
1

Verwenden Sie ggf. ?.forEach

%Vor%

Wenn du genau das Verhalten willst, das du beschrieben hast, denke ich, dass deine Variante besser liest als alles andere, das mir prägnanter ist. (Dennoch sollte einfach if ausreichen)

    
defhlt 15.10.2014 13:43
quelle
1

Zusätzlich zu den anderen Antworten können Sie den Safe-Call-Operator auch in Kombination mit der Erweiterungsmethode isNotEmpty() verwenden. Wegen des sicheren Aufrufs ist der Rückgabewert tatsächlich Boolean? , was entweder true , false oder null sein kann. Um den Ausdruck in einer if - oder when -Klausel zu verwenden, müssen Sie explizit prüfen, ob true :

lautet %Vor%

Alternative Syntax mit dem elvis-Operator:

%Vor%     
Kirill Rakhman 16.05.2016 09:26
quelle
-1

Erstens wollte ich empfehlen, neben @ mlatus Antwort, die else condition

handhabt, eine Erweiterungsfunktion zu machen %Vor%

Aber die Verwendung ist nicht so schön.

Eigentlich suchen Sie nach einer Maybe Monade

    
naixx 15.10.2014 14:23
quelle