我需要从List<Optional<String>>
删除所有空/空值。
示例:
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));
目前,我正在使用以下方法之一:
方式1:
List<String> collect = list.stream()
.filter(Optional::isPresent)
.map(obj ->obj.get())
.collect(Collectors.toList());
方式2:
List<Optional<String>> emptlist = new ArrayList<>();
emptlist.add(Optional.empty());
list.removeAll(emptlist);
还有其他更好的方法吗?
答案 0 :(得分:8)
removeIf
是最简单的方法:
list.removeIf(x -> !x.isPresent());
答案 1 :(得分:8)
使用 Java9 ,您可以使用新添加的 Optional::stream
API执行此操作:
List<String> collect = list.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
此方法可用于将
Stream
个可选元素转换为Stream
现值元素。
坚持使用 Java8 ,问题中的 Way1 已经足够恕我直言 -
List<String> collect = list.stream()
.filter(Optional::isPresent)
.map(Optional::get) // just a small update of using reference
.collect(Collectors.toList());
答案 2 :(得分:0)
对于任何想玩点乐趣或更好地了解Optionals和Streams(Java 8)工作的人:
List<String> collect=list.stream().
map(z->z.map(Stream::of)).
flatMap(ox->ox.orElseGet(Stream::empty)).
collect(Collectors.toList());