PartitioningBy 是 Java Stream API 中按布尔条件将数据分为 true/false 两组的收集器,返回键为 Boolean 的 Map;支持嵌套收集器定制分区结果,适用于合格/不合格等二分场景。

PartitioningBy 是 Java Stream API 中用于将数据按布尔条件“二分”(true/false)分区的收集器,适用于需要把集合拆成两个子集的场景,比如“合格/不合格”、“启用/禁用”、“奇数/偶数”等。
基础用法:按简单布尔条件分区
使用 Collectors.partitioningBy(Predicate) 即可。返回一个 Map<boolean list>></boolean>,其中键为 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>
进阶用法:嵌套收集器定制分组结果
第二个参数可传入另一个收集器,对每个分区内部做进一步聚合,比如转成 Set、统计数量、求和等。
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 转为 Set 避免重复:
partitioningBy(pred, toSet()) - 只统计数量:
partitioningBy(pred, counting()) - 计算偶数之和:
partitioningBy(n -> n % 2 == 0, summingInt(n -> n))
示例:统计偶数个数与奇数之和:
Map<boolean integer> result = numbers.stream()
.collect(Collectors.partitioningBy(
n -> n % 2 == 0,
Collectors.summingInt(n -> n)
));
// {false=9, true=12} → 奇数和=1+3+5=9,偶数和=2+4+6=12
</boolean>
实用技巧:结合自定义对象与方法引用
对对象流使用时,推荐用方法引用提升可读性。例如用户类有 isActive() 方法:
record User(String name, boolean active) {}
List<user> users = List.of(
new User("Alice", true),
new User("Bob", false),
new User("Charlie", true)
);
Map<boolean list>> byActive = users.stream()
.collect(Collectors.partitioningBy(User::active));
</boolean></user>
也可组合其他操作,如只提取活跃用户的姓名:
Map<boolean list>> namesByActive = users.stream()
.collect(Collectors.partitioningBy(
User::active,
Collectors.mapping(User::name, Collectors.toList())
));
</boolean>
注意事项与常见误区
- 分区键只有
true和false两种,不可扩展;若需多路分类,请用groupingBy - 空集合输入时,结果仍包含两个键,对应空列表(
true=[],false=[]) - 谓词函数应无副作用、幂等,避免在流并行处理时引发问题
- 注意 null 安全:若流中可能含 null,谓词中需显式判空,否则抛
NullPointerException
不复杂但容易忽略细节。用对了,能让条件分组逻辑更清晰、更函数式。

















