前言:在一次用stream.toList()方法获取List,并用这个List执行addAll()方法时报java.lang.UnsupportedOperationException: null错误,开始不明所以,后续把toList()换成了collect(Collectors.toList())就正常了。
因此引出
collect(Collectors.toList())和toList()的区别:
在 Java 8 及其后续版本中,Collectors.toList()
是 Java Stream API 的一部分,用于将流(Stream)中的元素收集到一个新的列表中。而 toList()
方法本身并不是 Java 标准库中的一部分,但在 Java 16 引入的预览特性(Preview Feature)中有一个新的 List.of()
方法的重载版本,它允许你通过调用 stream().toList()
来创建一个列表,但这与 Collectors.toList()
并不相同。
这里详细解释两者之间的区别:
Collectors.toList()
Collectors.toList()
是一个收集器(Collector),它是 Collectors
类中的一个静态方法。当你对一个流(Stream)调用 collect(Collectors.toList())
时,流中的元素会被收集到一个新的 List
中,通常是一个 ArrayList
的实例(但这不是必须的,因为 Collectors.toList()
的实现可能会根据具体的 Java 版本和库实现有所不同)。
示例:
List<String> list = Arrays.asList("a", "b", "c").stream()
.collect(Collectors.toList());
stream().toList()(Java 16+ 的预览特性)
在 Java 16 中,引入了一个新的预览特性,允许你通过调用 stream().toList()
来直接创建一个列表。但请注意,这是预览特性,在未来的版本中可能会发生变化或移除。这个 toList()
方法是 Stream
接口中的一个新方法,它返回一个新的列表,该列表包含此流中的元素。
示例(在 Java 16 或更高版本的预览特性下):
List<String> list = Arrays.asList("a", "b", "c").stream()
.toList(); // 注意:这是预览特性,可能需要启用预览功能才能编译
注意:在 Java 16 的预览版本中,stream().toList()
返回的列表类型是 List<T>
,而不是具体的实现类(如 ArrayList
)。这提供了更好的类型安全性,但也可能在某些情况下需要额外的类型转换或处理。
总结
Collectors.toList()
是 Java 8 引入的,用于通过流 API 收集元素到列表中。stream().toList()
是 Java 16 引入的预览特性,允许你更简洁地将流转换为列表。但请注意,这是预览特性,可能会在未来的版本中发生变化或移除。
在使用这些特性时,请确保你的代码与你的目标 Java 版本兼容,并考虑到可能的变化。对于需要向后兼容的代码库,通常建议使用 Collectors.toList()
。