You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:35:24