Collectors.partitioningBy 是 Java Stream 中专用于二分的收集器,根据 boolean 谓词将元素分为 true/false 两组并返回 Map;支持下游收集器进行组内聚合,键恒为 true/false,即使为空也存在,语义清晰且性能优于 groupingBy。

Collectors.partitioningBy 是 Java Stream 中专门用于“二分”场景的收集器,它根据一个返回 boolean 的谓词(Predicate),把流中元素严格分成两组:满足条件的归入 true 键,不满足的归入 false 键,最终返回一个 Map<boolean list>></boolean>。
基础用法:按布尔表达式切分列表
最常见的是对对象属性做真假判断。比如将用户列表按是否成年分开:
List<User> users = Arrays.asList(
new User("张三", 17),
new User("李四", 22),
new User("王五", 19)
);
Map<Boolean, List<User>> partitioned = users.stream()
.collect(Collectors.partitioningBy(user -> user.getAge() >= 18));
// partitioned.get(true) → 成年人列表
// partitioned.get(false) → 未成年人列表
配合下游收集器:不只是分组,还能进一步处理
partitioningBy 支持第二个参数——下游收集器(downstream collector),可对每组内部做聚合、转换或统计。例如只取每组的名字列表,或统计人数:
- 提取名字:
Collectors.mapping(User::getName, Collectors.toList()) - 统计数量:
Collectors.counting() - 求年龄平均值:
Collectors.averagingInt(User::getAge)
示例:获取成年人和未成年人的姓名列表
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
Map<Boolean, List<String>> nameGroups = users.stream()
.collect(Collectors.partitioningBy(
user -> user.getAge() >= 18,
Collectors.mapping(User::getName, Collectors.toList())
));
注意点:键只有 true 和 false,不会缺失
即使所有元素都满足(或都不满足)条件,map 中 true 和 false 键依然存在,对应空列表([])。不需要判空再取值,直接调用 get(true) 或 get(false) 即可,安全可靠。
替代方案对比:partitioningBy vs groupingBy
如果只是二分,partitioningBy 比 groupingBy 更语义明确、性能略优(底层做了优化),且强制要求谓词返回 boolean;而 groupingBy 更通用但需手动构造 key(如 user -> user.getAge() >= 18 ? "adult" : "minor"),易出错也稍重。

















