it-swarm.com.de

Entfernen Sie alle optionalen Leer-/Nullwerte aus der Arrayliste in Java

Ich muss alle leeren/Null-Werte aus List<Optional<String>> entfernen.

Beispiel:

List<Optional<String>> list = new ArrayList<>();

list.add(Optional.empty());
list.add(Optional.of("Str1"));
list.add(Optional.of("Str2"));
list.add(Optional.of("Str3"));
list.add(Optional.of("Str4"));
list.add(Optional.of("Str5"));
list.add(Optional.empty());
list.add(Optional.ofNullable(null));

Derzeit verwende ich einen der folgenden Ansätze:

Weg 1:

List<String> collect = list.stream()
                   .filter(Optional::isPresent)
                   .map(obj ->obj.get())
                   .collect(Collectors.toList());

Weg 2:

List<Optional<String>> emptlist = new ArrayList<>();
emptlist.add(Optional.empty());
list.removeAll(emptlist);

Gibt es einen anderen besseren Weg?

11
Niraj Sonawane

MitJava9können Sie dies mit der neu hinzugefügtenOptional::streamAPI tun:

List<String> collect = list.stream()
               .flatMap(Optional::stream)
               .collect(Collectors.toList());

Diese Methode kann verwendet werden, um eine Stream von optionalen Elementen in eine Stream von Elementen mit aktuellem Wert umzuwandeln.

BeiJava8zu bleiben, dasWay1ist meiner Meinung nach gut genug -

List<String> collect = list.stream()
               .filter(Optional::isPresent)
               .map(Optional::get) // just a small update of using reference
               .collect(Collectors.toList());
8
nullpointer

removeIf ist der kürzeste Weg, dies zu tun:

list.removeIf(x -> !x.isPresent());
8
Daniel Taub

Für alle, die ein bisschen Spaß haben oder die Arbeit mit Optionals und Streams besser verstehen wollen (Java 8):

List<String> collect=list.stream().
                                   map(z->z.map(Stream::of)).
                                   flatMap(ox->ox.orElseGet(Stream::empty)).
                                   collect(Collectors.toList());
  1. Die erste Zuordnungsfunktion konvertiert Optional [String] in Optional [Stream [String]]. Ein Stream String [Optional [Stream [String]]] wird somit weitergeleitet
  2. Der "Map" -Teil von flatmap konvertiert jeden optionalen [Stream [String]] in einen Stream [String]. Alle leeren Optionen werden durch einen leeren Stream ersetzt. Jetzt haben wir Stream [Stream [String]].
  3. Der "flache" Teil konvertiert Stream [Stream [String]] in Stream [String].
0
Sumit Paroothi