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()

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值