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?
MitJava9können Sie dies mit der neu hinzugefügtenOptional::stream
API tun:
List<String> collect = list.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
Diese Methode kann verwendet werden, um eine
Stream
von optionalen Elementen in eineStream
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());
removeIf
ist der kürzeste Weg, dies zu tun:
list.removeIf(x -> !x.isPresent());
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());