Filtern eines Streams von Optionals in Java

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.