collectors.partitioningby是java stream api中按布尔条件将元素分为true/false两组的收集器,返回固定含true/false键的map;支持下游收集器定制每组聚合结果,且空流时两键均映射空列表。

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>
注意:键只有两个固定值 —— true 和 false,不会多也不会少。
进阶用法:嵌套收集器定制分组内容
第二个参数可传入另一个收集器(如 Collectors.counting()、Collectors.summingInt() 等),用来对每组内部做聚合,而不是默认的 List:
- 统计每组数量:
Map<boolean long> counts = numbers.stream()
.collect(Collectors.partitioningBy(n -> n > 3, Collectors.counting()));
// {false=3, true=3}
</boolean>
- 计算偶数和奇数的和:
Map<boolean integer> sums = numbers.stream()
.collect(Collectors.partitioningBy(
n -> n % 2 == 0,
Collectors.summingInt(Integer::intValue)
));
// {false=9, true=12}
</boolean>
实用技巧与注意事项
- 分区结果 Map 的 key 类型固定为
Boolean,不能自定义键名(如想用 "even"/"odd",应改用groupingBy) - 空流也能正常工作,返回
{false=[], true=[]} - 如果谓词抛异常,整个收集过程会中断并抛出 unchecked exception
- 与
groupingBy不同,partitioningBy保证结果 Map 总是包含两个键(即使某组为空)
替代方案参考:什么时候不用 partitioningBy?
当需要按多个离散值(如状态、类型、等级)分组时,用 Collectors.groupingBy 更合适。例如按字符串分类:
// ✅ 正确:多类别分组
Map<string list>> byGender = people.stream()
.collect(Collectors.groupingBy(Person::getGender));
// ❌ 不适合:partitioningBy 只支持 true/false 二分
</string>
分区本质是“二分判断”,适用场景明确:开关类逻辑、满足/不满足条件、启用/禁用、通过/未通过等。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











