Java 10 Collectors 方法

10 Sept 2024 | 4 分钟阅读

Java Collects 在 Stream API 中起着至关重要的作用,它提供了一种方便的方式将流的元素转换为各种数据结构,如列表、集合或映射。在本节中,我们将探讨 Java 10 中一些常用的收集器方法。

toList() 方法

toList() 方法是一个简单而强大的收集器,可将流的元素转换为 List。当您想将流操作的结果收集到集合中以供进一步处理时,这尤其有用。

优点

  • 简单明了。
  • 将元素收集到 List 中,保留顺序。

缺点

  • 对于大型数据集可能效率不高,因为它需要创建一个新列表。

toSet() 方法

与 toList() 类似,toSet() 方法将流的元素收集到 Set 中,确保元素的唯一性。

优点

  • 删除重复的元素,确保唯一性。
  • 提供了一种将流转换为集合的快速方法。

缺点

  • 不保留元素的顺序。
  • 如果不需要唯一性,创建集合的开销可能是不必要的。

toMap() 方法

当您想将元素收集到 Map 中时,将使用 toMap() 方法。您提供两个函数:一个用于键,另一个用于值。

优点

  • 允许将元素映射到键和值。
  • 适用于创建自定义映射和转换。

缺点

  • 如果遇到重复键,可能会抛出 IllegalStateException。
  • 需要仔细处理潜在的键冲突。

joining() 方法

joining() 方法可用于将流的元素连接成一个字符串。您还可以提供可选的分隔符、前缀和后缀。

优点

  • 方便从流元素创建连接的字符串。
  • 支持使用分隔符、前缀和后缀进行自定义。

缺点

  • 与更复杂的聚合的专用收集器相比,功能有限。

groupingBy() 方法

groupingBy() 方法用于根据分类器函数对流的元素进行分组。它返回一个 Map,其中键是应用分类器函数的结果,值是项的 List。

优点

  • 根据分类器函数对元素进行分组。
  • 为创建嵌套数据结构提供了灵活性。

缺点

  • 可能不适合所有场景,尤其是当需要更复杂的组​​合逻辑时。

partitioningBy() 方法

partitioningBy() 方法是一种特殊的组​​合形式,其中根据谓词将元素分为两组。

优点

  • 根据谓词将元素分为两组。
  • 适用于二元分类。

缺点

  • 仅限于两个分区(true 和 false)。
  • 可能不适合超过两个类别。

以下是一个完整的 Java 代码示例,演示了各种收集器方法的用法以及每种方法的预期输出。

文件名:CollectorExamples.java

输出

toList() Output: [apple, banana, orange, grape, kiwi]
toSet() Output: [1, 2, 3, 4, 5]
toMap() Output: {1=One, 2=Two, 3=Three}
joining() Output: [apple, banana, orange, grape, kiwi]
groupingBy() Output: {5=[apple], 6=[banana, orange], 4=[kiwi], 3=[grape]}
partitioningBy() Output: {false=[apple, kiwi], true=[banana, orange, grape]}
toMap() with merge function Output: {5=apple, 6=banana, 7=orange, 4=grape}

注意:请记住,输出中的元素顺序可能会因某些收集器的性质而异(例如,toSet() 不保证顺序)。

让我们讨论一下提供的 Java 代码中展示的每种收集器方法的优缺点。

请记住,收集器方法的选择取决于您应用程序的具体要求,每种方法根据其使用上下文都有其优点和缺点。

这些只是 Java 10 及更早版本中提供的强大收集器方法中的几个示例。


下一主题Java 21