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(),你可以轻松地对流中的数据进行分组,并根据需要进一步处理每个分组的数据。

相关推荐
一定要AK4 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao4 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
KevinCyao4 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
航Hang*4 小时前
Windows Server 配置与管理——第3章:文件系统管理
运维·服务器·windows·vmware
迷藏4944 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
wuxinyan1235 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书5 小时前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队5 小时前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能
洛_尘5 小时前
Java EE进阶:Linux的基本使用
java·java-ee
无限进步_5 小时前
【C++】电话号码的字母组合:从有限处理到通用解法
开发语言·c++·ide·windows·git·github·visual studio