java - 如何选择 Collectors.toList() 返回的列表类型?

标签 java collections

<分区>

Collectors.toList() 的文档表示不保证返回的类型。

在一个简单的测试中:

Stream<String> s = Stream.of("Geeks", 
                                 "for", 
                                 "GeeksforGeeks", 
                                 "Geeks Classes"); 

List<String> myList = s.collect(Collectors.toList()); 

myList 的类型是 ArrayList。

T

这个类型是如何选择的?什么条件可能会改变返回的类型?

最佳答案

它是关于 future 变化的 API 规定。
实际上,返回的是 ArrayList:

public static <T>
Collector<T, ?, List<T>> toList() {
    return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                               (left, right) -> { left.addAll(right); return left; },
                               CH_ID);
}

但规范告诉我们,toList() 方法并未设计/用于返回特定的List 实现。
今天,实现显示返回了 ArrayList,但明天,新的 Java 版本可能会返回另一个实现(为什么不是不可变列表)。
因此,该方法的客户端不应考虑(至少理论上)始终返回 ArrayList

作为旁注,Collectors.toCollection(Supplier) 允许客户端提供用于收集的集合。
虽然很少使用,但您可以使用它来保证使用 ArrayList :

List<String> list = l.stream().collect(Collectors.toCollection(ArrayList::new));

关于java - 如何选择 Collectors.toList() 返回的列表类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57361411/

相关文章:

java - 为什么ArrayList的默认容量是10?

java - 为什么 java.util.Set 没有 get(int index)?

java - 如何使用java将列表中的Employee对象转换为student对象?

java - Spock 单元测试,常规左移赋值抛出 SpockExecutionException : Data provider has no data

java - DigestUtils md5Hex 的问题

Java - 移动窗口或最小化后图形消失

Java int[] 数组到 HashSet<Integer>

java - 在java程序中编译错误以使用hadoop计算文件中的单词

javax.validation.ValidationException : Unable to find a default provider

visual-studio - C# 如何使用 IEnumerator 创建通用列表集合