如何从Map中获取Optional值并转换为Optional<List>?
问题分析与解决方案
首先咱们先搞清楚编译错误的核心原因:你写的代码里,input.aMap().values().stream().collect(Collectors.toList()) 返回的是 List<Optional<Long>> 类型——也就是一个装着多个Optional<Long>的列表,但你却试图把它赋值给 Optional<List<Long>> 类型的变量(一个装着列表的Optional),这俩类型完全不兼容,编译器自然会报错。
接下来根据你的实际需求,有几种不同的正确写法:
情况1:你需要一个「装着所有Optional值的列表」的Optional
如果你的目标是把所有Optional<Long>收集成列表后,再用Optional包装起来(空列表也会被包装成Optional.of(emptyList),如果想让空列表返回Optional.empty()可以调整):
// 方式1:不管列表是否为空都包装成Optional Optional<List<Optional<Long>>> valuesList = input.aMap().values().stream() .collect(Collectors.collectingAndThen(Collectors.toList(), Optional::ofNullable)); // 方式2:仅当列表非空时返回Optional,空列表返回Optional.empty() Optional<List<Optional<Long>>> valuesList = input.aMap().values().stream() .collect(Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? Optional.empty() : Optional.of(list)));
情况2:你需要提取所有非空Optional里的Long值,再包装成Optional<List>
如果你的实际需求是把Map中所有存在值的Optional<Long>里的Long提取出来,组成列表后再用Optional包装(空列表返回Optional.empty()):
Optional<List<Long>> valuesList = input.aMap().values().stream() .filter(Optional::isPresent) // 过滤掉空的Optional .map(Optional::get) // 提取非空Optional里的Long值 .collect(Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? Optional.empty() : Optional.of(list)));
情况3:你其实只需要一个装着Optional的列表(不需要外层Optional)
如果你的代码只是写错了变量类型,实际想要的是所有Optional<Long>组成的列表,那只需要修正变量类型即可:
List<Optional<Long>> valuesList = input.aMap().values().stream() .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者Ganga
相关产品推荐
相关产品推荐

