partitioningby可按布尔条件将流分为成年(true)和未成年(false)两组,返回键为boolean、值为对应列表的map;支持嵌套下游收集器统计数量或转不可变集合,并需注意null及异常值处理。

用 partitioningBy 划分成年/未成年两组非常直接:它本质是按布尔条件做二分,返回一个 Map<boolean list>></boolean>,true 对应成年组,false 对应未成年组。
基础用法:一行代码完成分组
假设 User 类有 int age 字段,只需传入判断是否成年的谓词:
Collectors.partitioningBy(u -> u.getAge() >= 18)- 结果 Map 的键只有
true和false,值分别是满足/不满足条件的用户列表 - 无需手动创建两个空列表、遍历判断、分别 add —— Stream 自动完成
获取分组结果更清晰的方式
建议解构 Map,避免反复写 map.get(true) 这类易错写法:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用变量接收:
Map<boolean list>> groups = users.stream().collect(Collectors.partitioningBy(u -> u.getAge() >= 18));</boolean> - 再分别提取:
List<user> adults = groups.get(true); List<user> minors = groups.get(false);</user></user> - 注意:
get(false)不会为 null,即使没人未成年,也会返回空列表
配合其他收集器增强功能
partitioningBy 支持嵌套收集器,比如按年龄分组后,再对每组统计人数或转成 Set:
- 统计每组人数:
Collectors.partitioningBy(u -> u.getAge() >= 18, Collectors.counting())→ 返回Map<boolean long></boolean> - 转成不可变集合(防误修改):
Collectors.partitioningBy(u -> u.getAge() >= 18, Collectors.toUnmodifiableList()) - 注意第二个参数是“下游收集器”,只影响 value 的类型,key 始终是 Boolean
边界情况处理
实际使用中需留意几个细节:
- 如果用户对象为
null,谓词执行会抛NullPointerException,建议提前过滤:.filter(Objects::nonNull) - 年龄为负数或异常值?可在谓词里加校验,如
u -> u.getAge() >= 0 && u.getAge() >= 18 - 不需要未成年组?可只取
groups.get(true);但别用remove(false),没必要且破坏原始 Map 结构
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










