partitioningby 是 java stream api 中按布尔条件将流分为 true/false 两组的收集器,返回含两个固定 key 的 map,时间复杂度 o(n),支持嵌套分区与组合收集器,但需注意 null 处理及避免副作用。

partitioningBy 是 Java Stream API 中专门用于按布尔条件将流分为两组(true 和 false)的收集器,它返回一个 Map<boolean list>></boolean>,结构清晰、语义明确,比手动用 filter 拆两次更高效且可读性更强。
基础用法:传入一个 Predicate 即可完成二分流
只需提供一个返回 boolean 的函数,Stream 会自动把元素分到 true 和 false 对应的列表中:
- 不需要预先知道哪些元素满足条件,也不用写 if-else 分支
- 底层只遍历一次流,时间复杂度 O(n),比两次 filter 更优
- 结果 Map 必然包含两个 key:
true和false,即使某一边为空,对应 value 也是空列表
常见场景示例:区分奇偶数、正负数、是否为空等
比如把整数列表按奇偶分开:
Map
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
// partitioned.get(true) → [2, 4]
// partitioned.get(false) → [1, 3, 5]
再比如判断字符串是否为空:
ListMap
.collect(Collectors.partitioningBy(Objects::isNull));
// 注意:null 值需谨慎处理,建议先 map 或用 Objects::nonNull
进阶组合:嵌套 partitioningBy 或搭配其他收集器
可以将第二个参数换成其他收集器,改变 value 的类型。例如,不存 List,而统计每组数量:
Map.collect(Collectors.partitioningBy(n -> n % 2 == 0, Collectors.counting()));
也可以多层分区,比如先按奇偶,再对偶数按是否大于 10 分组(需用 groupingBy 配合):
.collect(Collectors.partitioningBy(
n -> n % 2 == 0,
Collectors.partitioningBy(n -> n > 10)
));
注意事项与避坑点
- 输入流为空时,返回的 Map 仍含两个 key,value 均为空 List
- Predicate 中避免副作用(如修改外部变量),否则结果不可预测
- 若需自定义 key 名(如 “even”/“odd”),应改用
groupingBy+ 分类函数,而非partitioningBy - 对 null 元素做判断前,务必检查或预处理,否则可能抛
NullPointerException
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











