Filtern eines Streams von Optionen in Java
1. Einführung
In diesem Artikel werden wir darüber sprechen, wie nicht leere Werte ausStream vonOptionals herausgefiltert werden.
Wir werden drei verschiedene Ansätze betrachten - zwei mit Java 8 und einer mit der neuen Unterstützung in Java 9.
Wir werden in allen Beispielen an der gleichen Liste arbeiten:
List> listOfOptionals = Arrays.asList(
Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));
2. Verwenden vonfilter()
Eine der Optionen in Java 8 besteht darin, die Werte mitOptional::isPresent herauszufiltern und dann die Zuordnung mit der FunktionOptional::get durchzuführen, um Werte zu extrahieren:
List filteredList = listOfOptionals.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
3. Verwenden vonflatMap()
Die andere Option wäre,flatMap mit einem Lambda-Ausdruck zu verwenden, der eine leereOptional in eine leereStream-Instanz und nicht leereOptional in eineStreamkonvertiert. s Instanz, die nur ein Element enthält:
List filteredList = listOfOptionals.stream()
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
Alternativ können Sie denselben Ansatz auf andere Weise anwenden, indem SieOptional inStream konvertieren:
List filteredList = listOfOptionals.stream()
.flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
.collect(Collectors.toList());
4. Optional :: stream von Java 9
All dies wird mit der Einführung von Java 9, dasOptional um einestream()-Methode erweitert, erheblich vereinfacht.
Dieser Ansatz ähnelt dem in Abschnitt 3 gezeigten, diesmal verwenden wir jedoch eine vordefinierte Methode zum Konvertieren der Instanz vonOptionalin eine Instanz vonStream:
Es wird ein Stream mit einem oder mehreren Elementen zurückgegeben, unabhängig davon, ob der Wert vonOptionalvorhanden ist oder nicht:
List filteredList = listOfOptionals.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
5. Fazit
Damit haben wir schnell drei Möglichkeiten gesehen, die aktuellen Werte ausStream vonOptionals herauszufiltern.
Die vollständige Implementierung von Codebeispielen finden Sie aufGithub project.