java stream 中没有 partitionby 方法,正确方法是 collectors.partitioningby,用于按布尔条件将流分为 true/false 两组并返回 map,必须配合 collect() 使用,不可链式调用。

Java Stream 中没有 partitionBy 方法,这是常见误解。真正对应的是 Collectors.partitioningBy,用于将流按布尔条件分成两组(true / false),返回一个 Map<boolean list>></boolean>。
partitioningBy 的基本写法
它属于收集器(Collector),必须配合 collect() 使用,不能直接链式调用在 Stream 上(比如没有 stream.partitionBy(...) 这种语法)。
- 最简形式:传入一个返回
boolean的 Predicate - 结果是
Map<boolean list>></boolean>,key 为true或false,value 是满足/不满足条件的元素列表
示例:把整数列表分为偶数和奇数
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
第二个参数可指定“当 key 为 true/false 时,各自内部怎么收集”,比如转成 Set、统计个数、求和等。
- 用
Collectors.counting()得到数量而非列表 - 用
Collectors.mapping(..., Collectors.toList())可先转换再收集
示例:统计偶数和奇数的个数
Map<boolean long> counts = numbers.stream()
.collect(Collectors.partitioningBy(
n -> n % 2 == 0,
Collectors.counting()
));
// {false=3, true=3}
</boolean>
注意点和常见误区
- 不是
groupingBy:后者按任意类型分组(如按字符串首字母),而partitioningBy严格只分两组,且 key 固定为 Boolean - 空流也能用:返回
{true=[], false=[]} - 不能直接用于并行流做“非安全”操作:若下游收集器不是并发安全的(如
toList()在并行流中仍安全,但自定义 collector 需留意) - 别写成
stream.partitionBy(...):编译报错,正确入口永远是Collectors.partitioningBy(...)
替代方案:需要多于两组时用 groupingBy
如果要按年龄分段(如“未成年”、“青年”、“中年”)、按状态枚举分类,就该用 Collectors.groupingBy:
Map<string list>> byAgeGroup = people.stream()
.collect(Collectors.groupingBy(p -> {
int age = p.getAge();
if (age
<p>不复杂但容易忽略:记住 partitioningBy 是 Collector,不是 Stream 的中间操作。</p></string>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











