跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Collectors.partitioningBy实现变量二分分组

Collectors.partitioningBy 是 Java 8 中用于按布尔条件二分分组的专用收集器,返回键为 true/false、值为对应元素列表的 Map;支持下游收集器定制聚合结果,要求 Predicate 空安全,适用于明确的二元分类场景。 Collectors.partitioningBy 是 Java 8 Stream API 中用于将流中元素按布尔条件“二分分组”的专用收集器,结果返回一个
Map>
,其中键为
true
或
false
,值为满足或不满足谓词的元素列表。 核心用法:传入 Predicate 即可完成二分 它不需要自定义分类函数,只需一个
Predicate
(即返回 boolean 的函数),自动拆成两组:
map.get(true)
:所有使 predicate 返回
true
的元素
map.get(false)
:其余元素(即 predicate 返回
false
的元素) 示例:按年龄是否大于等于 18 岁分组
Map> byAdult = people.stream() .collect(Collectors.partitioningBy(p -> p.getAge() >= 18));
支持嵌套收集器:替换默认的 ArrayList 第二个参数可传入任意下游收集器(如
Collectors.counting()
、
Collectors.mapping()
等),改变每组的聚合结果类型: 统计人数:
partitioningBy(..., counting())
→
Map
提取姓名:
partitioningBy(..., mapping(Person::getName, toList()))
→
Map>
求平均年龄:
partitioningBy(..., averagingInt(Person::getAge))
→
Map
注意 null 安全与逻辑覆盖 predicate 若返回
null
(如对 null 引用调用方法),会抛出
NullPointerException
。建议提前判空或使用安全表达式: 错误写法:
p -> p.getName().startsWith("A")
(p 为 null 时崩) 安全写法:
p -> p != null && p.getName() != null && p.getName().startsWith("A")
该操作天然覆盖全部元素——每个元素必属
true
或
false
组,无遗漏、无第三组。 和 groupingBy 的关键区别 别混淆二者:
partitioningBy
:仅限二分,键固定为
Boolean
,性能略优,语义更明确
groupingBy
:任意多组,键类型由分类函数决定,更通用但稍重 若业务逻辑本质是“是/否”“有/无”“通过/未通过”这类二元判断,优先用
partitioningBy
,代码更直观、意图更清晰。

相关文章