partitioningby是专为二选一分区设计的工具,依据布尔判断将数据分为true和false两组并返回map,天然保证仅两个键且结构简单。

Java Stream API 中的 partitioningBy 是专为“二选一”场景设计的分区工具,它不按任意键分组,而是严格依据布尔判断把数据切分为 true 和 false 两组,返回 Map<boolean list>></boolean>。
partitioningBy 的核心行为
它接收一个 Predicate<t></t>(即返回 boolean 的函数),对每个元素执行判断:满足条件进 true 键对应列表,否则进 false 键列表。结果 Map 永远只有两个键,不会为空或多余。
- 不同于
groupingBy可能产生多个分组,partitioningBy天然保证结构简单、语义明确 - 适合表达“合格/不合格”“启用/禁用”“奇数/偶数”“成年/未成年”等非此即彼的业务逻辑
- 即使流为空,也会返回包含两个空列表的 Map:
{true=[], false=[]}
基础用法:单谓词分区
最简形式只需传入一个判断逻辑:
List<string> words = List.of("one", "two", "three", "four");
Map<boolean list>> byLength = words.stream()
.collect(Collectors.partitioningBy(s -> s.length() > 3));
// 结果:{false=[one, two, four], true=[three]}
</boolean></string>
注意:谓词本身不决定哪边是“主”或“次”,只决定归属;true 组永远对应谓词返回 true 的元素。
增强用法:下游收集器定制每组结果
第二个参数可传入任意下游收集器(downstream collector),用于改造每组内部结构,避免后续再遍历处理。
- 统计每组数量:
Collectors.counting() - 提取某字段集合:
Collectors.mapping(Person::getName, Collectors.toList()) - 求和或平均值:
Collectors.summingInt(Student::getScore) - 嵌套分组:
Collectors.groupingBy(Student::getGrade)—— 先分真假,再按年级细分
示例:统计成年与未成年员工人数
Map<boolean long> ageCount = employees.stream()
.collect(Collectors.partitioningBy(
e -> e.getAge() >= 18,
Collectors.counting()
));
// {true=12, false=5}
</boolean>
常见误用与注意事项
partitioningBy 不是万能分组替代品,使用时需注意边界:
- 不能替代多值分组:若需按城市、状态、类型等多类别划分,请用
groupingBy - 谓词必须稳定:同一元素多次执行谓词应返回相同结果,否则行为不可预测
- 下游收集器作用于每个分区独立执行,互不影响
- 若需三态(如“高/中/低”),应考虑
groupingBy配合枚举或分类函数,而非强行拆解为多个partitioningBy
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











