![](/img/trans.png)
[英]How to convert Optional<List<Integer>> to Optional<ArrayList<Integer>>
[英]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.