Java Stream转List的几种方法
前几天分享了 如何优雅的调试Java Stream操作 。然后有小伙伴对其中的一段代码有一些疑问:“为啥你的stream可以直接toList而不必collect?” 下面就给大家解读下这个内容。
疑问的代码片段如下:
public class StreamTest { @Test void test() { List<String> list = List.of("blog.didispace.com", "spring4all.com", "openwrite.cn", "www.didispace.com"); List<String> result = list.stream() .filter(e -> e.contains("didispace.com")) .filter(e -> e.length() > 17) .toList(); System.out.println(result); } }
小伙伴疑问的就是第10行: toList()
。实际上这个方法是Java 16才支持的一个方法,它可以直接将 Stream
转化成 List
。而因为目前很多小伙伴还在用Java 8,所以在介绍如何调试Stream的时候,直接用我这段代码可能会碰到这个问题。
那么Java 8的用户怎么写呢?我看到也有网友直接给出了Java 8下的方法,就如下面这样:
List<String> result = list.stream() .filter(e -> e.contains("didispace.com")) .filter(e -> e.length() > 17) .collect(Collectors.toList());
Stream.toList() 和 Stream.collect(Collectors.toList()) 的区别
就完整上面的代码逻辑,这样的替换完全是可以的,但是虽然最终都转成List了,他们之间是否还有区别呢?
这里我单独拉出来说,显然肯定是有区别的。
通过查看 Stream.toList()
的源码:
default List<T> toList() { return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray()))); }
我们可以发现,它所创建的是一个 unmodifiableList
不可变的List。
而使用 Stream.collect(Collectors.toList())
创建出来的则是一个普通的List,是可以做增删改操作的。
那么如果在Java 8中也要创建不可变的List要怎么写呢?其实也很简单,只需要调用 Collectors.toUnmodifiableList()
就可以了。
所以与本文开头等价的Java 8代码替换应该这样写:
List<String> result = list.stream() .filter(e -> e.contains("didispace.com")) .filter(e -> e.length() > 17) .collect(Collectors.toUnmodifiableList());
好了,今天的分享就到这里,你学会了吗?
本期视频: http://www.bilibili.com/video/BV16Y411F7Pm/
如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!另外,不要走开,关注我,持续更新Java新特性专栏!
- 淘宝惊现GitHub“爱国套餐”,其实是刷Star
- 求求你们,别再刷 Star 了!这跟“爱国”没关系!
- 重磅!Spring Cloud 生态再添新套件:Spring Cloud Tencent
- 免申请直接用上 IDEA 新 UI,只需要这三步配置
- 如何设置IntelliJ IDEA的内存和启动参数
- spring-configuration-metadata.json文件是做啥的?
- JetBrains IDE全新UI预览版来了,要做简洁与强大兼顾的IDE
- 注意:Spring Boot 2.7开始spring.factories不推荐使用了,接下来这么玩...
- Spring Boot整合Swagger时PatternsRequestCondition.getPatterns()报错:"this.condition" is null
- Spring Boot Starter配置spring.factories的自动生成神器:mica-auto
- Stream.toList()和Collectors.toList()的性能比较
- Java Stream转List的几种方法
- Java中如何快捷的创建不可变集合
- 一文学会Java的交互式编程环境jshell
- Gitee仓库开源要审核为什么被喷?
- Java 15 新特性:隐藏类
- Java 17 新特性:switch的模式匹配(Preview)
- Java 16 新特性:record类
- PyScript:让Python在HTML中运行
- Java 14中对switch的增强,终于可以不写break了