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

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

在一个简单的测试中:

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

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

的类型myList是ArrayList。

http://img4.sycdn.imooc.com/64647aff000165e206550216.jpg

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



扬帆大鱼
浏览 251回答 2
2回答

偶然的你

它是关于未来变化的 API 规定。事实上,一个ArrayList返回:public&nbsp;static&nbsp;<T> Collector<T,&nbsp;?,&nbsp;List<T>>&nbsp;toList()&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;CollectorImpl<>((Supplier<List<T>>)&nbsp;ArrayList::new,&nbsp;List::add, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(left,&nbsp;right)&nbsp;->&nbsp;{&nbsp;left.addAll(right);&nbsp;return&nbsp;left;&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CH_ID); }但是规范告诉我们的是,该toList()方法并未设计/参与以返回特定的List实现。今天,实现显示已ArrayList返回,但明天,新的 Java 版本可能会返回另一个实现(为什么不是不可变列表)。因此,该方法的客户不应考虑(至少在理论上)ArrayList将始终返回 an 。作为旁注,Collectors.toCollection(Supplier)允许客户提供用于收集的集合。虽然很少使用,但您可以使用它来保证ArrayList使用 an :List<String>&nbsp;list&nbsp;=&nbsp;l.stream().collect(Collectors.toCollection(ArrayList::new));

慕标5832272

使用Collectors#toCollection(Supplier);您可以预先确定您想要的类型。例如Stream.of("a","b","c").collect(Collectors.toCollection(ArrayList::new));将返回一个新的 ArrayList。或者对于 LinkedListStream.of("a","b","c").collect(Collectors.toCollection(LinkedList::new));这两个示例都使用数据类型的零参数构造函数。并且Collectors#toList()不保证任何特定类型。因此理论上返回的类型可能因 java 版本而异。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java