collectors.partitioningby 是 java stream api 中按布尔条件将元素分为 true 和 false 两组的收集器,返回固定含 true/false 键的 map,支持下游收集器但不支持自定义键名。

Collectors.partitioningBy 是 Java Stream API 中用于按布尔条件将元素分成两组(true 和 false)的收集器,本质是返回一个 Map<boolean list>></boolean>。
核心用法:传入 Predicate 即可自动二分
只需提供一个返回 boolean 的函数(即 Predicate<t></t>),partitioningBy 就会把流中满足条件的元素归入 true 键对应的列表,其余归入 false 键对应列表。
- 结果 Map 固定包含两个 key:
true和false,即使某组为空,也会存在(对应空列表) - 不支持自定义分组键名,这是它和
groupingBy的关键区别 - 底层基于
Collector.of()实现,线程安全,可并行流使用
基础示例:按奇偶、正负、空非空等二值逻辑分组
比如对整数列表按奇偶划分:
List<integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Map<boolean list>> partitioned = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
// 结果:{false=[1, 3, 5], true=[2, 4]}
</boolean></integer>
再如字符串按是否为空:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
List<string> strs = Arrays.asList("a", "", "b", null);
Map<boolean list>> byNonNull = strs.stream()
.collect(Collectors.partitioningBy(Objects::nonNull));
// 注意:null 会导致 NullPointerException,应先处理或改用 s -> s != null
</boolean></string>
进阶技巧:嵌套 partitioningBy 或结合下游收集器
第二个参数可传入另一个收集器,用于定制每组内部的聚合方式。例如统计每组数量而非存列表:
Map<boolean long> counts = numbers.stream()
.collect(Collectors.partitioningBy(
n -> n > 3,
Collectors.counting() // 下游收集器
));
// 结果:{false=3, true=2}
</boolean>
也可嵌套使用,比如先按正负分区,再在正数中按奇偶二次分区(需两次 collect 或 flatMap 拆解):
Map<boolean map list>>> nested = numbers.stream()
.collect(Collectors.partitioningBy(
n -> n > 0,
Collectors.partitioningBy(n -> n % 2 == 0)
));
</boolean>
注意事项:空值、性能与可读性
使用时注意三点:
- 确保 predicate 不抛异常,尤其涉及
toString()、length()等可能 NPE 的操作,建议提前 filter 或用 Optional 包装 - partitioningBy 本质是遍历一次完成分组,时间复杂度 O(n),比两次 filter + collect 更高效
- 语义明确但灵活性低——若需要多于两个分组(如按等级 A/B/C),应改用
groupingBy
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










