Collectors.toList() 的文档表示不保证返回的类型。
在一个简单的测试中:
Stream<String> s = Stream.of("Geeks",
"for",
"GeeksforGeeks",
"Geeks Classes");
List<String> myList = s.collect(Collectors.toList());
myList
的类型是 ArrayList。
这个类型是如何选择的?什么条件可能会改变返回的类型?
它是关于 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));