java.lang.UnsupportedOperationException: null报错之collect(Collectors.toList())和toList()的区别
前言:在一次用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()。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)