Collectors.toList()的文档说不保证返回的类型。在一个简单的测试中:Stream<String> s = Stream.of("Geeks",
"for",
"GeeksforGeeks",
"Geeks Classes");
List<String> myList = s.collect(Collectors.toList());的类型myList是ArrayList。这种类型是如何选择的?什么条件可能会改变返回的类型?
2 回答
偶然的你
TA贡献1841条经验 获得超3个赞
它是关于未来变化的 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
将始终返回 an 。
作为旁注,Collectors.toCollection(Supplier)
允许客户提供用于收集的集合。
虽然很少使用,但您可以使用它来保证ArrayList
使用 an :
List<String> list = l.stream().collect(Collectors.toCollection(ArrayList::new));
慕标5832272
TA贡献1966条经验 获得超4个赞
使用Collectors#toCollection(Supplier);您可以预先确定您想要的类型。
例如
Stream.of("a","b","c").collect(Collectors.toCollection(ArrayList::new));
将返回一个新的 ArrayList。
或者对于 LinkedList
Stream.of("a","b","c").collect(Collectors.toCollection(LinkedList::new));
这两个示例都使用数据类型的零参数构造函数。
并且Collectors#toList()不保证任何特定类型。因此理论上返回的类型可能因 java 版本而异。
添加回答
举报
0/150
提交
取消