314. Java Stream API - 使用 Collectors.partitioningBy() 分区元素

文章目录

  • [314. Java Stream API - 使用 `Collectors.partitioningBy()` 分区元素](#314. Java Stream API - 使用 Collectors.partitioningBy() 分区元素)
    • [✅ **总结**](#✅ 总结)

314. Java Stream API - 使用 Collectors.partitioningBy() 分区元素

在 Java Stream API 中,Collectors 工厂类提供了多种创建映射的模式,其中之一是通过布尔值作为键来分区流中的元素。这个分区功能是通过 partitioningBy() 工厂方法实现的。

✅ partitioningBy() 简介

partitioningBy() 会根据一个布尔值来将流中的元素分成两个部分,返回一个 Map<Boolean, List<T>>。true 和 false 分别作为键,流中的每个元素会被放入对应的列表中,具体分到哪个键由给定的 谓词(predicate) 决定。

简而言之,partitioningBy() 是一种基于条件将流中的元素划分为两组的方法。条件是通过谓词来判断的,谓词作为 partitioningBy() 的参数传入。

✅ 示例:根据字符串长度分组

假设我们有一个字符串列表,我们想根据每个字符串的长度来将其分组:长度大于 4 的放到 true 组,长度不大于 4 的放到 false 组。以下是如何实现的代码:

java 复制代码
Collection<String> strings = List.of("one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
                                     "ten", "eleven", "twelve");

Map<Boolean, List<String>> map = strings.stream()
                                         .collect(Collectors.partitioningBy(s -> s.length() > 4));

map.forEach((key, value) -> System.out.println(key + " :: " + value));

运行结果:

java 复制代码
false :: [one, two, four, five, six, nine, ten]
true :: [three, seven, eight, eleven, twelve]

在这个示例中,partitioningBy() 使用了一个谓词 s -> s.length() > 4 来将字符串分成两组:

  • false 组:长度小于等于 4 的字符串。
  • true 组:长度大于 4 的字符串。

✅ 使用下游收集器(Downstream Collector)

partitioningBy() 不仅可以使用一个简单的谓词来进行分区,还可以进一步定制每个分区的收集方式。它支持传入一个 下游收集器(downstream collector),用于对每个分区中的元素进行额外的操作。

例如,我们可以对每个分区的字符串进行排序。通过给 partitioningBy() 传入一个排序的收集器,我们就能按要求对每个分区进行操作。

示例:对每个分区的元素进行排序

java 复制代码
Map<Boolean, List<String>> map = strings.stream()
                                         .collect(Collectors.partitioningBy(s -> s.length() > 4,
                                                                             Collectors.toList()));

map.forEach((key, value) -> {
    List<String> sortedList = value.stream()
                                   .sorted()
                                   .collect(Collectors.toList());
    System.out.println(key + " :: " + sortedList);
});

运行结果:

java 复制代码
false :: [five, four, nine, one, six, ten, two]
true :: [eight, eleven, seven, three, twelve]

在这个例子中,我们使用了 Collectors.toList() 作为下游收集器,并在 partitioningBy() 之后对每个分区中的元素进行排序。false 和 true 组中的字符串按照字母顺序排列。

✅ 总结

  • partitioningBy() 的作用 :将流中的元素基于一个谓词条件分成两个组,生成一个 Map<Boolean, List<T>>。
  • 谓词的作用 :谓词决定每个元素应分配到 true 组还是 false 组。
  • 下游收集器的使用 :partitioningBy() 可以接受一个下游收集器,用于对每个分区中的元素进行额外的操作,如排序、聚合等。
  • 常见应用场景:这个方法非常适合用于二分类分区操作,例如根据条件分割数据,或者在分区后执行不同的操作。

通过 partitioningBy(),你可以轻松地对流中的数据进行分组,并根据需要进一步处理每个分组的数据。

相关推荐
IT枫斗者枫哥2 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
代码方舟2 小时前
Java数据工程:利用天远全网运营商三要素优化线上实名认证合规体验
java·人工智能
BBmmo2 小时前
我的 Java 学习笔记 · 第 7 篇:泛型与通配符
java
独泪了无痕2 小时前
Hutool之RandomUtil:随机数生成的终极利器
java·后端
律宏阔2 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
花开路口2 小时前
深入理解 Java/Kotlin 协变与逆变
java·kotlin
律宏阔2 小时前
Windows 禁用联想笔记本所有 Lenovo 后台服务
windows
律宏阔2 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
运行时异常2 小时前
【WMS 仓储系统集成 AI Agent 实战】第 7 讲:Vue3 前端工程化——Token 刷新锁、Markdown 渲染踩坑与权限体系
java
她的男孩2 小时前
开放接口限流从 20 改到 200 还是每分钟 20 次:拆完防重放+幂等+限流,我找到 5 个静默失效的坑
java·后端·架构