collectors.partitioningby() 是 java stream api 中按布尔条件将流元素分为 true/false 两组并返回 map 的收集器,支持嵌套收集器定制子列表,结果 map 固定含 true/false 两键,适用于二元分类场景。

Collectors.partitioningBy() 是 Java Stream API 中用于将流中的元素按布尔条件分成两组(true 和 false)的收集器,返回一个 Map<boolean list>></boolean>。
基础用法:按简单条件分区
最常见的是传入一个 Predicate,根据其返回值把元素分到 true 或 false 对应的列表中。
例如,把整数列表分为“偶数”和“奇数”:
List<integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
Map<boolean list>> partitioned = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
// 结果:{false=[1, 3, 5], true=[2, 4, 6]}
</boolean></integer>
注意:false 键对应不满足条件的元素,true 键对应满足条件的元素。
进阶用法:嵌套收集器定制子列表
第二个参数可传入另一个收集器,用来替换默认的 toList(),比如转成 Set、统计数量、或进一步转换。
- 转为
Set去重:
Map<boolean set>> sets = numbers.stream()
.collect(Collectors.partitioningBy(n -> n > 3, Collectors.toSet()));
</boolean>
- 只统计每组数量(返回
Map<boolean long></boolean>):
Map<boolean long> counts = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0, Collectors.counting()));
</boolean>
实用技巧与注意事项
- 分区结果 Map 固定只有两个键:
true和false,即使某组为空,该键仍存在且对应空列表(如Arrays.asList()) - 适合二元判断场景(是/否、启用/禁用、有效/无效),不适合多类别分组(此时用
groupingBy) - 若需自定义键名(如
"even"/"odd"),不能直接用partitioningBy,应改用groupingBy配合三元表达式或函数映射 - 支持链式处理:可在分区后对某一分组继续操作,例如
partitioned.get(true).stream().map(...)
结合对象属性分区的示例
对用户列表按是否成年分区:
record User(String name, int age) {}
List<user> users = List.of(new User("Alice", 25), new User("Bob", 17), new User("Charlie", 30));
Map<boolean list>> byAdult = users.stream()
.collect(Collectors.partitioningBy(u -> u.age >= 18));
// true: [Alice, Charlie], false: [Bob]
</boolean></user>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











