Collectors.partitioningBy根据布尔条件将流元素分为两组,适用于二元分类场景。例如按年龄区分成年与未成年用户,支持结合下游收集器统计数量或提取属性,提升代码可读性。

在Java 8引入的Stream API中,Collectors.partitioningBy 是一个非常实用的收集器,它可以根据一个布尔条件将集合元素划分为两个分区:满足条件的归为一组(key为true),不满足的归为另一组(key为false)。这种操作在需要对数据进行二分分类时特别高效。
该方法接收一个Predicate函数式接口作为参数,返回一个Map<Boolean, List<T>>类型的结果。下面是一个简单的例子:
假设我们有一个用户列表,想把成年用户和未成年用户分开:
List<User> users = Arrays.asList(
new User("Alice", 25),
new User("Bob", 17),
new User("Charlie", 30),
new User("Diana", 16)
);
Map<Boolean, List<User>> partitionedByAge = users.stream()
.collect(Collectors.partitioningBy(user -> user.getAge() >= 18));
System.out.println("成年人: " + partitionedByAge.get(true));
System.out.println("未成年人: " + partitionedByAge.get(false));
输出结果将是:
立即学习“Java免费学习笔记(深入)”;
成年人: [User{name='Alice', age=25}, User{name='Charlie', age=30}]
未成年人: [User{name='Bob', age=17}, User{name='Diana', age=16}]
除了默认生成List外,还可以指定下游收集器来改变分区后的数据结构。例如,只统计每组人数:
Map<Boolean, Long> countByAgeGroup = users.stream()
.collect(Collectors.partitioningBy(
user -> user.getAge() >= 18,
Collectors.counting()
));
System.out.println("成年组人数: " + countByAgeGroup.get(true)); // 输出 2
System.out.println("未成年组人数: " + countByAgeGroup.get(false)); // 输出 2
也可以将名字提取成集合:
Map<Boolean, List<String>> namesPartitioned = users.stream()
.collect(Collectors.partitioningBy(
user -> user.getAge() >= 18,
Collectors.mapping(User::getName, Collectors.toList())
));
使用 partitioningBy 适合处理非此即彼的二元分类问题。比如:
注意:如果分类标准多于两种,应考虑使用 Collectors.groupingBy 而不是多次调用partitioningBy。
基本上就这些。合理利用partitioningBy能让代码更清晰,减少手动遍历和if-else判断,提升可读性和维护性。
以上就是在Java中如何使用Collectors.partitioningBy实现集合分区_Collectors分区操作技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号