如何将Map<Object, Optional<String>>按Optional是否存在拆分为两个列表?
优化方案:使用Stream的
Collectors.partitioningBy 你可以利用Java Stream API中的Collectors.partitioningBy,这是最简洁且声明式的实现方式,它会直接帮你把元素按条件分成两组:
Map<Boolean, List<Object>> partitioned = myMap.entrySet() .stream() .collect(Collectors.partitioningBy(entry -> entry.getValue().isPresent())); List<Object> presentObjects = partitioned.get(true); // Optional值存在的Object列表 List<Object> absentObjects = partitioned.get(false); // Optional值不存在的Object列表
为什么这比原实现更优:
- 代码更简洁,无需手动初始化两个列表和编写分支判断逻辑
- 采用声明式编程风格,可读性更强,一眼就能看出是按Optional是否存在分组
- 底层实现经过优化,性能和原forEach方式相当,批量处理时表现更稳定
如果偏好独立初始化两个列表的写法,也可以用Stream的filter分别收集,但这种方式需要遍历两次Map,效率略低于单次遍历的partitioningBy:
List<Object> presentObjects = myMap.entrySet() .stream() .filter(entry -> entry.getValue().isPresent()) .map(Map.Entry::getKey) .collect(Collectors.toList()); List<Object> absentObjects = myMap.entrySet() .stream() .filter(entry -> !entry.getValue().isPresent()) .map(Map.Entry::getKey) .collect(Collectors.toList());
综上,Collectors.partitioningBy是最优选择,既简洁又高效。
内容的提问来源于stack exchange,提问作者SCM
相关产品推荐
相关产品推荐

