繁体   English   中英

如何转换 ArrayList <optional<test> &gt; 至 ArrayList <test></test></optional<test>

[英]How to convert ArrayList<Optional<Test>> to ArrayList<Test>

 ArrayList<Optional<Test>> valueList= vv.values().stream().collect(Collectors.toList());
 

我将这些值放入一个以ArrayList<Optional<Test>>作为返回类型的列表中,但我需要将其转换为ArrayList<Test>而没有可选的返回类型。

如何在 Java 8 或 Java 7 中将ArrayList<Optional<Test>>转换为ArrayList<Test>

1.使用过滤器()

Java 8 中的一个选项是使用Optional::isPresent过滤掉值,然后使用Optional::get function 执行映射以提取值:

ArrayList<Test> testlist = valueList.stream()
  .filter(Optional::isPresent)
  .map(Optional::get)
  .collect(Collectors.toList());

2.使用flatMap()

另一种选择是将flatMap与 lambda 表达式一起使用,该表达式将空 Optional 转换为空 Stream 实例,并将非空 Optional 转换为仅包含一个元素的 ZEAE835E83C0494A376229F254F7D3392 实例:

ArrayList<Test> testlist = valueList.stream()
  .flatMap(t -> t.isPresent() ? Stream.of(t.get()) : Stream.empty())
  .collect(Collectors.toList());

您可以使用方法参考应用相同的方法将 Optional 转换为 Stream:

ArrayList<Test> testlist = valueList.stream()
  .flatMap(t -> t.map(Stream::of).orElseGet(Stream::empty))
  .collect(Collectors.toList());

3.Java 9个可选::stream

在 Java 9 中,stream() 方法已添加到 Optional class 中以改进其功能。这与第 2 节中显示的类似,但这次我们使用预定义的方法将 Optional 实例转换为 ZEAE833922ZF2754F74D3如果 Optional 包含一个值,则返回一个包含该值的 Stream。 否则,它返回一个空的 stream。

ArrayList<Test> testlist = valueList.stream()
  .flatMap(Optional::stream)
  .collect(Collectors.toList());

使用 Java 8 Streams 你可以这样做:

    public static <T> List<T> unpackOptionals(List<Optional<T>> listOfOptionals) {
        return listOfOptionals.stream()
              .filter(Optional::isPresent)
              .map(Optional::get)
              .collect(Collectors.toList());
    }

使用 Java 9 或更高版本,您可以使用方法Optional.stream()来完成这项工作:

    public static <T> List<T> unpackOptionals(List<Optional<T>> listOfOptionals) {
        return listOfOptionals.stream()
              .flatMap(Optional::stream)
              .collect(Collectors.toList());
    }

在 Java 7 中你不应该有任何Optional (它们是在 Java 8 中添加的)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM