Verkettung von Optionalen in Java 8
Suche nach einem Weg, um die Kette Optionen, so dass die erste eine, die vorhanden ist, wird zurückgegeben. Wenn keine vorhanden sind Optional.empty()
zurückgegeben werden soll.
Vorausgesetzt, ich habe mehrere Methoden wie diese:
Optional<String> find1()
Ich versuche, die Kette Sie:
Optional<String> result = find1().orElse( this::find2 ).orElse( this::find3 );
aber natürlich nicht funktioniert, da orElse
einen Wert erwartet und orElseGet
erwartet eine Supplier
.
InformationsquelleAutor der Frage piler | 2015-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Stream:
Wenn Sie brauchen, um zu bewerten die Methoden träge, verwenden Lieferanten Funktionen:
InformationsquelleAutor der Antwort Sauli Tähkäpää
Könnte man es so machen:
Aber ich bin mir nicht sicher, ob es die Lesbarkeit verbessert IMO. Guava bietet eine Möglichkeit zur Kette Optionen:
Könnte es sein eine alternative für Ihr problem, aber nicht die standard-Optional-Klasse im JDK.
Wenn Sie möchten, um die standard-API, die Sie schreiben, könnte eine simple utility-Methode:
dann:
Wenn Sie eine Menge von Optionen zu Ketten, vielleicht ist es besser, verwenden Sie die Stream-Ansatz als andere wissen schon.
InformationsquelleAutor der Antwort Alexis C.
Inspiriert von Sauli Antwort, ist es möglich, die
flatMap()
Methode.Konvertieren Optional in einen Stream ist zu umständlich. Anscheinend ist dieses gehen zu sein Feste mit JDK9. Also das könnte so geschrieben werden, als
Nach einem Java-Update 9 veröffentlicht wurde
Obwohl die ursprüngliche Frage war über Java 8,
Optional::oder
war eingeführt in Java 9. Mit es, das problem konnte wie folgt gelöstInformationsquelleAutor der Antwort Indrek Ots
Durchführen Optional Chaining Ersten konvertieren - Stream-Optional Mit einer der beiden Methoden
Einmal optional erhalten wird, optional zwei weitere Instanz-Methode, die auch in der Stream-Klasse ich.e-filter und map().
verwenden Sie diese Verfahren und Methoden zu prüfen, die Ausgabe verwenden ifPresent(System.out :: Println)
ex:
Stream s = Stream.(1,2,3,4);
s.findFirst().filter((a)->a+1).ifPresent(System.out :: Println)
Ausgabe : 2
InformationsquelleAutor der Antwort Adit chandel
Vielleicht einer von
tun.
Die erste iteriert über ein array von Lieferanten. Die erste nicht-leere
Optional<>
zurückgegeben. Wenn wir nicht finden, kehren wir ein leeresOptional
.Die zweite macht das gleiche mit einem
Stream
vonSuppliers
die Durchlaufen wird, fragte jeder (aus Faulheit) für Wert, die dann gefiltert leerOptional
s. Die erste nicht-leere zurückgegeben wird, oder, wenn keine solche existiert, wird eine leere ein.InformationsquelleAutor der Antwort glglgl