partitioningby 是 java stream api 中按布尔条件将流元素分为 true/false 两组并返回 map 的收集器,支持下游收集器聚合,且始终包含 true 和 false 两个键。

partitioningBy 是 Java Stream API 中专门用于布尔条件二分的收集器,它把流中元素按 true/false 拆成两个组,返回一个 Map<boolean list>></boolean>,用起来简洁高效。
基础用法:传入 Predicate 即可完成分区
只需提供一个返回 boolean 的判断逻辑(比如 lambda 表达式),Stream 就自动分成两组:
- 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));
System.out.println(partitioned.get(true)); // [2, 4, 6]
System.out.println(partitioned.get(false)); // [1, 3, 5]</boolean></integer>
结合下游收集器做进一步聚合
partitioningBy 支持第二个参数——下游收集器(downstream collector),可以对每个分区单独处理,比如统计数量、求和、转 Set 等:
- 统计每组个数:
Collectors.counting() - 只取每组第一个元素:
Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? null : list.get(0)) - 转成不可变集合:
Collectors.toUnmodifiableList()
示例:按字符串长度是否 ≥ 5 分区,并分别统计数量:
List<string> words = Arrays.asList("hi", "hello", "ok", "world", "java");
Map<boolean long> countByLength = words.stream()
.collect(Collectors.partitioningBy(
s -> s.length() >= 5,
Collectors.counting()
));
System.out.println(countByLength); // {false=3, true=2}</boolean></string>
注意 false 组不会为空,即使所有元素都满足条件
partitioningBy 总是返回包含 true 和 false 两个 key 的 Map。哪怕所有元素都满足条件,map.get(false) 也会返回一个空列表(或下游收集器对应结果,如 0L):
- 默认行为:
get(false)返回new ArrayList() - 使用下游收集器时,
get(false)返回下游的“空结果”,比如counting()返回0L
这点和 groupingBy 不同——groupingBy 只会包含实际出现的分组 key。
实用技巧:用 get(true)/get(false) 替代 if-else 拆分逻辑
当你需要把数据一分为二并分别处理时,partitioningBy 比手动遍历 + if-else 更清晰。比如分离有效/无效订单:
Map<boolean list>> validInvalid = orders.stream()
.collect(Collectors.partitioningBy(Order::isValid));
List<order> validOrders = validInvalid.get(true);
List<order> invalidOrders = validInvalid.get(false);
processValidOrders(validOrders);
logInvalidOrders(invalidOrders);</order></order></boolean>
代码语义明确,且天然支持并行流(parallelStream()),无需额外同步。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











