Was ist der eleganteste Weg, um Optionen kombinieren?

Hier ist, was ich habe, so weit:

Optional<Foo> firstChoice = firstChoice();
Optional<Foo> secondChoice = secondChoice();
return Optional.ofNullable(firstChoice.orElse(secondChoice.orElse(null)));

Diese Streiks mich als abscheulichen und verschwenderischen. Wenn firstChoice ist vorhanden, ich bin unnötig computing 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, um das Ende, ohne duplizieren der mapper oder deklarieren eine lokale variable. All dies macht den code komplizierter als das eigentliche problem gelöst wird.

Ich würde viel lieber schreiben diese:

return firstChoice().alternatively(secondChoice());

Jedoch Optional::alternativ natürlich nicht vorhanden. Was nun?

  • mögliche Duplikate von Get Wert aus einem Optionalen oder anderen
  • ... wenn konfrontiert mit dem problem der null ... jetzt haben wir zwei Probleme.
  • Btw, Paul Sandoz nur veröffentlicht, changeset für das review, das stellt Optional.or() Methode, die genau das tut, was Sie wollen: firstChoice().or(this::secondChoice). Mehr Infos unter JDK-8080418. In Java-9-mal werden wir glücklich sein!
Schreibe einen Kommentar