Nir*_*ane 10 java java-8 java-stream java-9
我需要从中删除所有空/空值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));
Run Code Online (Sandbox Code Playgroud)
目前,我正在使用以下方法之一:
方式1:
List<String> collect = list.stream()
.filter(Optional::isPresent)
.map(obj ->obj.get())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
方式2:
List<Optional<String>> emptlist = new ArrayList<>();
emptlist.add(Optional.empty());
list.removeAll(emptlist);
Run Code Online (Sandbox Code Playgroud)
还有其他更好的方法吗?
Nam*_*man 10
使用Java9,您可以使用新添加的Optional::streamAPI 执行此操作:
List<String> collect = list.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
此方法可用于将
Stream可选元素的a转换Stream为现值元素.
坚持使用Java8,问题中的Way1已经足够恕我直言 -
List<String> collect = list.stream()
.filter(Optional::isPresent)
.map(Optional::get) // just a small update of using reference
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
removeIf 是最短的方法:
list.removeIf(x -> !x.isPresent());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1935 次 |
| 最近记录: |