Collectors.partitioningBy() 可根据布尔条件将流元素一次性分为 true/false 两组,返回 Map;支持传入 Predicate 和可选下游收集器,get(true)/get(false) 永不返回 null。

Collectors.partitioningBy() 是 Java 8 Stream API 中一个非常实用的收集器,它能根据布尔条件把流中的元素**一次性分成两组**:满足条件的归入 true 键对应的列表,不满足的归入 false 键对应的列表。结果是一个 Map<boolean list>></boolean>,结构清晰、语义明确,比手写循环或两次 filter 更简洁高效。
核心用法:传入一个 Predicate 即可
只需提供一个返回 boolean 的判断逻辑(比如 user -> user.isActive()),partitioningBy 就自动完成分组:
- 键为
true的值 → 所有满足条件的元素组成的List - 键为
false的值 → 所有不满足条件的元素组成的List
获取两个列表:直接从 Map 中取值
分组后,用 map.get(true) 和 map.get(false) 就能拿到两个独立列表,无需额外转换:
Map<Boolean, List<User>> partitioned = users.stream()
.collect(Collectors.partitioningBy(User::isActive));
List<User> activeUsers = partitioned.get(true); // 活跃用户
List<User> inactiveUsers = partitioned.get(false); // 非活跃用户
注意:get(true) 和 get(false) 永远不会返回 null —— 即使某组为空,也会返回空 List(不是 null)。
进阶技巧:嵌套另一个收集器定制子列表
partitioningBy 支持第二个参数,传入任意其他收集器,比如只取用户名、去重、或转成 Set:
-
partitioningBy(User::isActive, mapping(User::getName, toList()))→ 得到Map<boolean list>></boolean> -
partitioningBy(User::isActive, collectingAndThen(toSet(), Collections::unmodifiableSet))→ 得到不可变 Set
和 groupingBy 的关键区别
别混淆这两个收集器:
-
partitioningBy:**只能按真假二分**,固定输出Map<boolean ...></boolean>,底层优化更轻量 -
groupingBy:按任意分类函数分组(如按城市、按年龄区间),返回Map<k ...></k>,更通用但稍重
如果你的需求就是“是/否”、“开/关”、“通过/未通过”这类二元切分,partitioningBy 是最直接、最不易出错的选择。

















