Ich habe mit dem neuen optionalen Typ in Java 8 gearbeitet und bin auf eine allgemeine Operation gestoßen, die funktional nicht unterstützt wird: eine "orElseOptional"
Betrachten Sie das folgende Muster:
Optional<Result> resultFromServiceA = serviceA(args);
if (resultFromServiceA.isPresent) return result;
else {
Optional<Result> resultFromServiceB = serviceB(args);
if (resultFromServiceB.isPresent) return resultFromServiceB;
else return serviceC(args);
}
Es gibt viele Formen dieses Musters, aber es läuft darauf hinaus, ein "orElse" für ein optionales Element zu wollen, das eine Funktion übernimmt, die ein neues optionales Element erzeugt, das nur aufgerufen wird, wenn das aktuelle nicht vorhanden ist.
Die Implementierung würde folgendermaßen aussehen:
public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
return value != null ? this : other.get();
}
Ich bin gespannt, ob es einen Grund gibt, warum es eine solche Methode nicht gibt, ob ich Optional nur unbeabsichtigt verwende und welche anderen Möglichkeiten die Leute gefunden haben, um mit diesem Fall umzugehen.
Ich sollte sagen, dass ich denke, dass Lösungen mit benutzerdefinierten Dienstprogrammklassen / -methoden nicht elegant sind, da Leute, die mit meinem Code arbeiten, nicht unbedingt wissen, dass sie existieren.
Wenn jemand weiß, wird eine solche Methode in JDK 9 enthalten sein, und wo könnte ich eine solche Methode vorschlagen? Dies scheint mir eine ziemlich krasse Auslassung der API zu sein.
orElseGet()
für was OP benötigt, nur generiert es keine schöne kaskadierende Syntax.