Java 中的 Collectors.toCollection()

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

在 Java 中,Collectors.toCollection() 方法是 java.util.Stream.Collectors 类提供的一个非常有用的方法,它允许你将流中的元素收集到你指定的特定类型的集合中。该方法提供了选择你想要将流元素收集到的集合类型的灵活性。

语法

其中每个参数如下:

<T>: 这是一个通用类型参数,表示流中元素的类型。在使用该方法时,你需要指定你正在处理的元素的实际类型。例如,当你有一个 String 元素流时,你会使用 String 作为类型参数。

<C extends Collection<T>>: 这是另一个通用类型参数,表示你想要将流元素收集到的集合类型。C 类型参数必须是 Collection<T> 的子类型,以确保收集到的元素可以存储在特定的集合类型中。例如,如果你需要将元素收集到一个 ArrayList<String> 中,你会使用 ArrayList<String> 作为类型参数。

Collector<T, ?, C>: 这是 toCollection() 方法的返回类型。它表示一个将流元素收集到指定集合类型 (C) 的收集器。T 表示流中元素的类型,而 "?" 表示一个未指定的中间结果类型。

Supplier<C> collectionFactory: 这是一个函数式接口,表示一个供应商函数。它负责创建你喜欢的集合类型 (C) 的新实例。collectionFactory 参数用于提供集合创建逻辑。你可以提供一个方法引用或一个返回新集合实例的 lambda 表达式。例如,ArrayList::new 或 HashSet::new 可以用作集合工厂来创建 ArrayList 或 HashSet 的新实例。

示例 1

算法

步骤 1: 创建一个名为 names 的 List,其中包含一些名字。

步骤 2: 在 names 上调用 stream() 方法以创建元素的流。

步骤 3: 调用流上的 collect() 方法,将 Collectors.toCollection(TreeSet::new) 作为收集器传入。

步骤 4: TreeSet::new 是一个方法引用,它创建 TreeSet 的一个新实例,该实例将用于存储唯一的名称。

步骤 5: collect() 操作会将流中的元素收集到 TreeSet 中。

步骤 6: 将结果赋给 nameSet 变量。

步骤 7: 最后,打印 nameSet 的内容,由于 TreeSet 的特性,它将包含已排序的唯一名称。

实施

上述步骤的实现如下

文件名: ToCollectionExample.java

输出

Unique names: [Alice,Bob,Charlie]

复杂度分析

时间复杂度: O(n) 到 O(n log n),具体取决于流操作。

空间复杂度: O(n),其中 n 是元素的数量。

示例 2

算法

步骤 1: 使用 Stream.of() 创建一个数字流,并将数字作为参数传入 (1,2,3,4,5)。

步骤 2: 调用流上的 collect() 方法,并将 Collectors.toCollection(ArrayList::new) 作为收集器传入。

步骤 3: 这指定了元素应被收集到 ArrayList 中。

步骤 4: ArrayList::new 方法引用被用作 collectionFactory 参数,它创建 ArrayList 的一个新实例来存储收集到的元素。

步骤 5: 收集到的元素被赋给类型为 List<Integer> 的 numberList 变量。

步骤 6: 使用 System.out.println() 打印 numberList 的内容。

实施

上述步骤的实现如下

文件名: ToCollectionExample.java

输出

Collected List: [1,2,3,4,5]

复杂度分析

时间复杂度: O(n) 到 O(n log n),具体取决于流操作。

空间复杂度: O(n),其中 n 是元素的数量。