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>>truefalse 分别作为键,流中的每个元素会被放入对应的列表中,具体分到哪个键由给定的 谓词(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() 之后对每个分区中的元素进行排序。falsetrue 组中的字符串按照字母顺序排列。

总结

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

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

相关推荐
消失的旧时光-194320 分钟前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
NE_STOP29 分钟前
Redis--发布订阅命令和Redis事务
java
PAC_3Dame33 分钟前
记一次真实的线上OOM
java
SunnyDays10111 小时前
如何在Java中将Word文档转换为图像(JPEG、PNG或SVG)
java
x-cmd1 小时前
[260429] x-cmd v0.9.1:一键开启 DeepSeek-V4-Pro Max 模式 + 1M 上下文;顺手重构了 uuid 模块
windows·重构·uuid·claude·curl·x-cmd·deepseek-v4-pro
Lumos_7771 小时前
Linux -- 线程
java·jvm·算法
知兀1 小时前
【MybatisPlus】后端用枚举类,数据库用tinyint,存在枚举类型转换
java
StockTV1 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
User_芊芊君子1 小时前
【OpenAI 把 AI 玩明白了】:自主推理 + 动态知识图谱,这 4 个技术突破要颠覆行业
java·人工智能·知识图谱
今夕资源网1 小时前
Windows 上安装 Claude Code并且接入DeepSeekV4-Pro的Max模式和激活1M上下文
windows