为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

扬帆大鱼 2023-05-17 14:57:47
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));


查看完整回答
反对 回复 2023-05-17
?
慕标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 版本而异。


查看完整回答
反对 回复 2023-05-17
  • 2 回答
  • 0 关注
  • 181 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信