昨天给大家介绍了Java 16中的Stream增强,可以直接通过toList()来转换成List

主要涉及下面这几种转换方式:

list.stream().toList();
list.stream().collect(Collectors.toList());
list.stream().collect(Collectors.toUnmodifiableList());

然后,看到有网友评论问:Stream.toList()Collectors.toList()的区别是什么?哪个性能好?

处理结果的区别,其实上一篇文章和视频里都有说:

  • Stream.toList()返回的List是不可变List,不能增删改
  • Collectors.toList()返回的是个普通的List,可以增删改
  • Collectors.toUnmodifiableList()返回的List是不可变List,不能增删改

而至于性能的话,今天我们就来测试一下,看看哪个性能更好。

@BenchmarkMode(Mode.All)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 20, time = 1, batchSize = 10000)
@Measurement(iterations = 20, time = 1, batchSize = 10000)
public class BenchmarkStreamToList { @Benchmark
public List<Integer> streamToList() {
return IntStream.range(1, 1000).boxed().toList();
} @Benchmark
public List<Integer> collectorsToList() {
return IntStream.range(1, 1000).boxed().collect(Collectors.toList());
} @Benchmark
public List<Integer> streamToList() {
return IntStream.range(1, 1000).boxed().toList();
} }

结果报告:

Benchmark                                                                                  Mode  Cnt   Score    Error  Units
BenchmarkStreamToList.collectorsToList thrpt 20 24.422 ± 0.268 ops/s
BenchmarkStreamToList.collectorsToUnmodifiableList thrpt 20 22.784 ± 0.599 ops/s
BenchmarkStreamToList.streamToList thrpt 20 31.779 ± 1.732 ops/s
BenchmarkStreamToList.collectorsToList avgt 20 0.045 ± 0.006 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList avgt 20 0.062 ± 0.035 s/op
BenchmarkStreamToList.streamToList avgt 20 0.040 ± 0.028 s/op
BenchmarkStreamToList.collectorsToList sample 445 0.046 ± 0.002 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.00 sample 0.039 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.50 sample 0.041 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.90 sample 0.057 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.95 sample 0.073 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.99 sample 0.102 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.999 sample 0.150 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.9999 sample 0.150 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p1.00 sample 0.150 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList sample 460 0.044 ± 0.001 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.00 sample 0.042 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.50 sample 0.044 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.90 sample 0.046 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.95 sample 0.047 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.99 sample 0.051 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.999 sample 0.057 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.9999 sample 0.057 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p1.00 sample 0.057 s/op
BenchmarkStreamToList.streamToList sample 655 0.031 ± 0.001 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.00 sample 0.030 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.50 sample 0.031 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.90 sample 0.032 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.95 sample 0.033 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.99 sample 0.035 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.999 sample 0.037 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.9999 sample 0.037 s/op
BenchmarkStreamToList.streamToList:streamToList·p1.00 sample 0.037 s/op
BenchmarkStreamToList.collectorsToList ss 20 0.043 ± 0.001 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList ss 20 0.045 ± 0.004 s/op
BenchmarkStreamToList.streamToList ss 20 0.031 ± 0.001 s/op

从报告中我们可以看到:

  • 吞吐量:streamToList > collectorsToList > collectorsToUnmodifiableList
  • 平均耗时:streamToList > collectorsToList > collectorsToUnmodifiableList
  • p0.9999耗时:streamToList > collectorsToUnmodifiableList > collectorsToList
  • 冷启动耗时:streamToList > collectorsToList > collectorsToUnmodifiableList

所以,Stream.toList()的性能要各方面都要好于Collectors.toList()Collectors.toUnmodifiableList()

如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!

本文收录在了我正在连载的《Java新特性专栏》,该系列该用电子书的方式编写,如果想要沉浸式阅读学习的话,可以访问Web版本:https://www.didispace.com/java-features/

再放大一些数据量,试试:

@Benchmark
public List<Integer> streamToList() {
return IntStream.range(1, 10000).boxed().toList();
} @Benchmark
public List<Integer> collectorsToList() {
return IntStream.range(1, 10000).boxed().collect(Collectors.toList());
} @Benchmark
public List<Integer> streamToList() {
return IntStream.range(1, 10000).boxed().toList();
}

结果报告:

Benchmark                                                                                  Mode  Cnt  Score   Error  Units
BenchmarkStreamToList.collectorsToList thrpt 20 2.186 ± 0.162 ops/s
BenchmarkStreamToList.collectorsToUnmodifiableList thrpt 20 2.184 ± 0.042 ops/s
BenchmarkStreamToList.streamToList thrpt 20 3.538 ± 0.058 ops/s
BenchmarkStreamToList.collectorsToList avgt 20 0.426 ± 0.004 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList avgt 20 0.469 ± 0.016 s/op
BenchmarkStreamToList.streamToList avgt 20 0.293 ± 0.008 s/op
BenchmarkStreamToList.collectorsToList sample 58 0.448 ± 0.049 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.00 sample 0.414 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.50 sample 0.422 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.90 sample 0.458 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.95 sample 0.560 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.99 sample 1.160 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.999 sample 1.160 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p0.9999 sample 1.160 s/op
BenchmarkStreamToList.collectorsToList:collectorsToList·p1.00 sample 1.160 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList sample 60 0.458 ± 0.004 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.00 sample 0.447 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.50 sample 0.455 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.90 sample 0.471 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.95 sample 0.482 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.99 sample 0.492 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.999 sample 0.492 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.9999 sample 0.492 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p1.00 sample 0.492 s/op
BenchmarkStreamToList.streamToList sample 78 0.293 ± 0.012 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.00 sample 0.277 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.50 sample 0.284 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.90 sample 0.309 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.95 sample 0.377 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.99 sample 0.459 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.999 sample 0.459 s/op
BenchmarkStreamToList.streamToList:streamToList·p0.9999 sample 0.459 s/op
BenchmarkStreamToList.streamToList:streamToList·p1.00 sample 0.459 s/op
BenchmarkStreamToList.collectorsToList ss 20 0.474 ± 0.133 s/op
BenchmarkStreamToList.collectorsToUnmodifiableList ss 20 0.493 ± 0.099 s/op
BenchmarkStreamToList.streamToList ss 20 0.325 ± 0.056 s/op

从报告中我们可以看到

  • 吞吐量:streamToList > collectorsToList > collectorsToUnmodifiableList
  • 平均耗时:streamToList > collectorsToList > collectorsToUnmodifiableList
  • p0.9999耗时:streamToList > collectorsToUnmodifiableList > collectorsToList
  • 冷启动耗时:streamToList > collectorsToList > collectorsToUnmodifiableList

所以,即使集合内的元素增大,Stream.toList()的性能在各方面依然都要好于Collectors下的方法。

好了,今天的分享就到这里,你学会了吗?

本期视频:https://www.bilibili.com/video/BV16Y411F7Pm/

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

Stream.toList()和Collectors.toList()的性能比较的更多相关文章

  1. java 数据类型:Stream流 对象转换为集合collect(Collectors.toList()) ;常用方法count,limit,skip,concat,max,min

    集合对象.stream() 获取流对象,对元素批处理(不改变原集合) 集合元素循环除了用for循环取出,还有更优雅的方式.forEach 示例List集合获取Stream对象进行元素批处理 impor ...

  2. GroupBy之后加ToList和不加ToList有什么区别吗?

        class Program    {        static void Main(string[] args)        {             List<Person> ...

  3. Stream-快速入门Stream编程

    1.什么是流 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执 ...

  4. List集合去重的一些方法(常规遍历、Set去重、java8 stream去重、重写equals和hashCode方法)

    1. 常规元素去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素. // 遍历后判断赋给另一个list集合,保持原来顺 ...

  5. JAVA8之 Stream 流(四)

    如果说前面几章是函数式编程的方法论,那么 Stream 流就应该是 JAVA8 为我们提供的最佳实践. Stream 流的定义 Stream 是支持串行和并行操作的一系列元素.流操作会被组合到流管道中 ...

  6. 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)

    方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...

  7. JDK 8 新特性之函数式编程 → Stream API

    开心一刻 今天和朋友们去K歌,看着这群年轻人一个个唱的贼嗨,不禁感慨道:年轻真好啊! 想到自己年轻的时候,那也是拿着麦克风不放的人 现在的我没那激情了,只喜欢坐在角落里,默默的听着他们唱,就连旁边的妹 ...

  8. JAVA8学习——从使用角度深入Stream流(学习过程)

    Stream 流 初识Stream流 简单认识一下Stream:Stream类中的官方介绍: /** * A sequence of elements supporting sequential an ...

  9. Java 8 Stream API 引入和使用

    引入流 流是什么 流是Java API的新成员,它允许你以声明性的方式处理数据集合.可以看成遍历数据集的高级迭代.流可以透明地并行处理,无需编写多线程代码.我们先简单看一下使用流的好处.下面两段代码都 ...

随机推荐

  1. ECMAScript中有两种属性:数据属性和访问器属性。

    ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们.为了表示特性是内部值,该规范把它们放在了两对儿方括号中,例如 [[Enumerable ...

  2. video标签学习使用

    video标签学习使用 学习前的理解 video是HTML5中的新标签,可以用来播放视频.对于不同的浏览器支持的视频格式不一样,但是具体浏览器支持的类型并不清楚. 支持的类型 视频的格式分为编码格式和 ...

  3. web开发者踏入人工智能的利器_Tensorflow.js

    前言 最近公司向员工搜集公司杂志的文章,刚好最近学习了机器学习相关课程.为了赚取购买课程的费用,所以写了如下文章投稿赚取稿费. 如下文章可能涉及一些我所购买课程的内容,所以不便将所有资源进行展示. 当 ...

  4. Python窗口学习之浅尝按键触发事件

    一.窗口上敲键盘触发事件(以Enter键为例) 二.点击窗口按钮触发事件(以鼠标左键双击为例) 代码: import tkinter as tk root = tk.Tk() root.geometr ...

  5. ubantu系统之 在当前文件夹打开终端

    直接安装一个软件包 "nautilus-open-terminal"终端输入:sudo apt-get install nautilus-open-terminal重启系统!

  6. 虚拟机上 安装 CentoOS 7.5 1804 过程记录

    1.准备安装镜像 在开始安装CentOS之前,必须下载安装ISO映像.镜像可从CentOS网站https://www.centos.org/download/.提供以下基本类型的镜像: DVD ISO ...

  7. JavaScript中数组的方法和字符串方法总结

    数组是首先的一个对象, 可以通过Array构造器创建一个数组,数组方法总结如下 cacat()  链接两个数组 join()  将数组链接成字符串 pop() 删除最后一个元素  shift()  删 ...

  8. Java报错:Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.4.26.v20200117:run (default-cli) on project ssm-mybatis-plus: Failure

    修改一下端口就好了,不要用80端口. <plugin> <groupId>org.eclipse.jetty</groupId> <!--嵌入式Jetty的M ...

  9. springboot+springsecurity+mybatis plus注解实现对方法的权限处理

    文章目录 接上文 [springboot+springsecurity+mybatis plus之用户授权](https://blog.csdn.net/Kevinnsm/article/detail ...

  10. Struts2-使用forEach标签+el标签获取值栈数据

    import cn.web.body.User; import com.opensymphony.xwork2.ActionSupport; import java.util.ArrayList; i ...