Hier ist, was ich bisher habe:Was ist die eleganteste Art, Optionale zu kombinieren?
Optional<Foo> firstChoice = firstChoice();
Optional<Foo> secondChoice = secondChoice();
return Optional.ofNullable(firstChoice.orElse(secondChoice.orElse(null)));
Das erscheint mir als beide abscheulich und verschwenderisch. Wenn firstChoice vorhanden ist, erstelle ich unnötigerweise secondChoice.
Es gibt auch eine effizientere Version:
Optional<Foo> firstChoice = firstChoice();
if(firstChoice.isPresent()) {
return firstChoice;
} else {
return secondChoice();
}
Hier kann ich nicht Kette einige Mapping-Funktion bis zum Ende, ohne entweder den Mapper duplizieren oder eine andere lokale Variable deklarieren. All dies macht den Code komplizierter als das eigentliche Problem, das gelöst wird.
ich viel lieber würde dies schreiben:
return firstChoice().alternatively(secondChoice());
jedoch Optional :: alternativ existiert offensichtlich nicht. Was jetzt?
möglich Duplikat [Get Wert von einer Optional oder einem anderen] (http://stackoverflow.com/questions/24599996/get-value- von der einen oder anderen Option – Tunaki
... wenn wir mit dem Problem der Null konfrontiert werden ... jetzt haben wir zwei Probleme. – ZhongYu
Btw, Paul Sandoz hat gerade ein [changeset] veröffentlicht (http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8080418-optional-or/webrev/src/java.base/share/classes/java /util/Optional.java.udiff.html) für die Überprüfung, die die 'Optional.oder()' Methode einführt, die genau das tut, was Sie wollen: 'firstChoice(). or (this :: secondChoice)'. Weitere Informationen erhalten Sie unter [JDK-8080418] (https://bugs.openjdk.java.net/browse/JDK-8080418). In Java-9-mal werden wir glücklich sein! –