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?
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
,
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
.
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!
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.