Wie komme ich zurück, wenn ein optionales Feld leer ist?

10

Ich liebe, dass optionals jetzt in der Java-Standardbibliothek sind . Aber es gibt ein grundlegendes Problem, dem ich immer wieder begegne und das ich nicht herausgefunden habe, wie man es am besten lösen kann (am einfachsten zu lesen und zu verstehen, am schönsten, am kürzesten):

Wie kann man von einer Methode zurückkehren, wenn ein optionales Feld leer ist?

Ich suche nach einer allgemeinen Lösung, die für verschiedene Kombinationen von Optionszahlen und Größen von Codeblöcken funktioniert.

In den folgenden Beispielen werde ich versuchen zu zeigen, was ich meine:

%Vor%

Bei dieser Frage geht es darum, wie man den guten Aspekt der beiden oben genannten Beispiele sieht: Der Typ der optionalen und der Kürze der Typen, deren Schreibzugriff zulässig ist, ist sicher.

Der Rest der Beispiele veranschaulicht das mehr.

%Vor%

Wie kann ich von einer Methode zurückkehren, wenn ein optionales leer ist, ohne get im Rest der Methode zu verwenden, ohne eine zusätzliche Variable deklarieren zu müssen und ohne zusätzliche Ebenen der Blockverschachtelung?

Oder wenn es nicht möglich ist, all das zu bekommen, was ist der beste Weg, um mit dieser Situation umzugehen?

    
Lii 27.06.2016, 20:28
quelle

4 Antworten

12

Sie könnten orElse(null) :

verwenden %Vor%     
dnault 27.06.2016, 20:31
quelle
6

Sie können stattdessen die Methoden ifPresent und map verwenden, wenn die Funktion ungültig ist und Sie Nebenwirkungen ausführen müssen, können Sie ifPresent ,

verwenden %Vor%

Wenn eine andere Methode die Option Optional zurückgibt, muss diese Methode möglicherweise ebenfalls ein Optional zurückgeben und die Zuordnungsmethode

verwenden %Vor%

Meist der Zeit, wenn Sie isPresent und get aufrufen, verwenden Sie Optional .

    
Sleiman Jneidi 27.06.2016 20:38
quelle
5

Wenn ifPresent, das Sie verwenden, kein neues Lambda erstellen muss, können Sie einfach einen Methodenverweis verwenden:

%Vor%

Dies löst nicht wirklich den Fall, in dem Sie das Vorhandensein von zwei Optionalen konditionieren möchten. Aber als Alternative zu

%Vor%

Warum nicht einfach die Bedingung umkehren, was auch im verschachtelten Fall gut funktioniert? Sie müssen die Rückgabe nicht explizit machen:

%Vor%

Diese Art von Use Cases schlägt jedoch vor, dass Sie nicht von einem Optional-Wert profitieren, sondern von einem NULL-Wert. Im Allgemeinen, wenn Sie mit isPresent und get arbeiten, wird Ihnen Optionally möglicherweise nicht wirklich viel bringen (außer, dass Sie gezwungen sind, den Fall zu berücksichtigen, in dem der Wert fehlt). Die Verwendung von ifPresent, map, filter und anderen "more functional" -Methoden könnte typisch für einen optionalen Wert sein.

Bitte geben Sie auf keinen Fall null zurück, wenn Sie ein Optional versprechen. Obwohl es völlig legal ist, NULL zurückzugeben, wenn ein Objekt erwartet wird, ist der Punkt von Optional genau, um zu vermeiden, dass auf Null geprüft werden muss. Also nicht:

%Vor%

aber stattdessen tun:

%Vor%

Andernfalls müssen Sie tun:

%Vor%

Das macht wirklich zweimal die gleiche Sache. Verwenden Sie ein Optional oder verwenden Sie einen Nullwert, aber tun Sie beides nicht!

    
Joshua Taylor 27.06.2016 20:32
quelle
0

Ich glaube nicht, dass das, was du fragst, tatsächlich möglich ist, aber ich würde vorschlagen, dass du einfach all deinen Code, der direkt auf deinen String wirkt, einpackst und ihn in eine Funktion einpackst. So wird deine Funktion etwa so:

%Vor%

Auf diese Weise haben Sie nur den String im Gültigkeitsbereich und Sie müssen .get() nicht jedes Mal aufrufen, wenn Sie darauf zugreifen möchten.

    
Luka Jacobowitz 27.06.2016 20:34
quelle

Tags und Links