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

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

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

方式一:

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

方式二:

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

还有其他更好的方法吗?

最佳答案

Java9 中,您可以使用新添加的 Optional::stream 执行此操作 应用程序接口(interface):

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

This method can be used to transform a Stream of optional elements to a Stream of present value elements.

坚持使用 Java8,问题中的 Way1 已经足够好了恕我直言 -

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

关于java - 从java中的arraylist中删除所有可选的空/空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48020703/

相关文章:

java-8 - 列表的列表和 Java 8

java - 为什么通过 "= "在 java 中复制列表是错误的?

java - for循环显示2个然后3个结果?

java - 如何使用 Java 连接到本地主机 HBase

java - RHEL 每个目录的文件数限制

java - 使用 Stream 按给定索引序列排序

java - 使用smtp java读取发送的邮件

scala - 如何在 scala 中使用 java8 lambda 和函数

java - 作为字符串的函数名称

Java8使用流从类对象中提取多个字段