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<Integer>> partitioned = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
// 结果:{false=[1, 3, 5], true=[2, 4, 6]}
注意:false 键对应不满足条件的元素,true 键对应满足条件的元素。
立即学习“Java免费学习笔记(深入)”;
进阶用法:嵌套收集器定制子列表
第二个参数可传入另一个收集器,用来替换默认的 toList(),比如转成 Set、统计数量、或进一步转换。
- 转为
Set去重:
Map<Boolean, Set<Integer>> sets = numbers.stream()
.collect(Collectors.partitioningBy(n -> n > 3, Collectors.toSet()));
- 只统计每组数量(返回
Map<boolean long></boolean>):
Map<Boolean, Long> counts = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0, Collectors.counting()));
实用技巧与注意事项
- 分区结果 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<User>> byAdult = users.stream()
.collect(Collectors.partitioningBy(u -> u.age >= 18));
// true: [Alice, Charlie], false: [Bob]


















