Java 8 中的收集

2024 年 9 月 10 日 | 阅读 3 分钟

Java 8,于 2014 年发布,是 Java 编程语言的一次重大变革。在其众多新特性和改进中,最显著的添加之一是引入了 Stream API 和功能强大的 Stream Collectors。这些增强功能使得处理集合以及以更简洁、更具表现力的方式对数据执行复杂操作变得更加容易。

在本节中,我们将探讨 Java 8 中的收集概念,并深入研究 Stream Collectors 的世界,这是一个用于在流中转换和聚合数据的强大工具。

收集的需求

在 Java 8 之前,在 Java 中处理集合通常需要编写样板代码来手动迭代元素并累积结果。这容易出错、冗长,并使代码更难阅读和维护。Java 8 通过引入流和收集器解决了这些问题。

流为处理数据序列提供了更高级别的抽象。它们允许我们以更函数式和声明式的方式表达数据上的操作。但是,一旦我们在流上执行了转换和操作,我们通常需要将结果收集到数据结构中或执行聚合操作。这就是收集器的作用所在。

Stream Collectors

Java 8 中的 Stream Collectors 是 `java.util.stream.Collectors` 类中的一组实用方法,它们可以轻松地将流中的元素累积到集合中,或执行诸如求和、平均和分组之类的聚合操作。收集器非常灵活,可以根据您的具体需求进行自定义。

以下是 Stream Collectors 实现的一些常见操作:

1. 收集到 List 或 Set

我们可以分别使用 `Collectors.toList()` 和 `Collectors.toSet()` 方法轻松地将流元素收集到 List 或 Set 中。

2. 分组元素

我们可以使用 `Collectors.groupingBy()` 根据特定标准对流中的元素进行分组。例如,按年龄对 persons 列表进行分组。

3. 求和与平均

我们可以使用 `Collectors.summingInt()`、`Collectors.summingLong()` 或 `Collectors.averagingDouble()` 轻松计算数值属性的总和或平均值。

4. 连接字符串

我们可以使用 `Collectors.joining()` 将流中的元素连接成一个字符串。

自定义收集器

虽然内置收集器涵盖了许多常见用例,但我们可以使用 `Collectors.collectingAndThen()` 方法创建自定义收集器。该方法允许我们对另一个收集器的结果执行其他处理。

下面是一个使用 `collectingAndThen()` 创建自定义收集器的示例,该收集器将元素收集到 Set 中,然后将其转换为不可变的 Set。

使用此自定义收集器,我们可以像这样将元素收集到不可变的 Set 中:

结论

在 Java 8 中,Stream API 和 Stream Collectors 的引入彻底改变了我们处理集合和聚合数据的方式。收集器提供了一种强大而灵活的机制,用于从流中收集、转换和聚合数据。无论我们需要对数据进行分组、计算总和与平均值,还是创建自定义收集器,Java 8 的 Stream Collectors 都能满足您的需求。

这些功能极大地简化和提高了 Java 代码的可读性,使其更具表现力和简洁性。因此,如果您还没有采用 Java 8 的 Stream Collectors,那么是时候探索它们的潜力并在 Java 项目中利用它们的力量了。