从java中的arraylist中删除所有可选的空/空值

时间:2017-12-29 09:58:02

标签: 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));

目前,我正在使用以下方法之一:

方式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);

还有其他更好的方法吗?

3 个答案:

答案 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());
  1. 第一个map函数将Optional [String]转换为Optional [Stream [String]]。流字符串[可选 [Stream [String]]]因此向前传递
  2. 平面图的“地图”部分将每个Optional [Stream [String]]转换为Stream [String]。所有空的Optionals都由空的Stream代替。现在我们有了Stream [Stream [String]]。
  3. “扁平”部分将Stream [Stream [String]]转换为Stream [String]。