Java8新特性stream和parallelStream有什么区别

news2024/11/23 11:39:29

1 stream和parallelStream的区别

1.Stream 是在 Java8 新增的特性,普遍称其为流;它不是数据结构也不存放任何数据,其主要用于集合的逻辑处理。

2.Stream流是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值),它只是在原数据集上定义了一组操作。

3.Stream流不保存数据,Stream操作是尽可能惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作。

4.Stream流不会改变原有数据,想要拿到改变后的数据,要用对象接收。

串行流stream:串行处理数据,不产生异步线程。
并行流parallelStream:parallelStream提供了流的并行处理,它是Stream的另一重要特性,其底层使用Fork/Join框架实现。简单理解就是多线程异步任务的一种实现。

建议:数据量不大的情况下建议使用stream即可,不要盲目大量使用parallelStream,因为parallelStream是多线程异步的,也就是说会产生多线程,消耗内存不说,说不定还会更慢,并非一定会更快更好。

2 常用方法介绍

2.1 groupingBy方法

主要是转化数据为Map,value是符合条件的集合

List<Admin> adminList = adminMapper.selectList(null);
Map<Long, List<Admin>> adminMap = adminList.stream().collect(Collectors.groupingBy(Admin::getId));

2.2 toMap方法

主要是转化数据为Map,value是该条记录或字段值

List<Admin> adminList = adminMapper.selectList(null);
Map<Long, String> adminMap = adminList.stream().collect(Collectors.toMap(Admin::getId, Admin::getRealName, (key1, key2) -> key1));

2.3 filter方法

主要是用来筛选数据的

List<Admin> adminList = adminMapper.selectList(null);
adminList = adminList.stream().filter(admin -> admin.getAdminState() != null).collect(Collectors.toList());

2.4 anyMatch方法

用于判断数据,只要有一个条件满足即返回true

List<Admin> adminList = adminMapper.selectList(null);
boolean isAdmin = adminList.stream().anyMatch(admin -> admin.getAdminState() != null);

2.5 allMatch方法

用于判断数据,必须全部都满足才会返回true

List<Admin> adminList = adminMapper.selectList(null);
boolean isAdmin = adminList.stream().allMatch(admin -> admin.getAdminState() != null);

2.6 noneMatch方法

用于判断数据,全都不满足才会返回true

List<Admin> adminList = adminMapper.selectList(null);
boolean isAdmin = adminList.stream().noneMatch(admin -> admin.getAdminState() != null);

2.7 map方法

一般用于获取属性值

List<Admin> adminList = adminMapper.selectList(null);
List<Long> adminIdList = adminList.stream().map(Admin::getId).collect(Collectors.toList());

2.8 peek方法

一般用于改变数据,但是官方不建议使用

List<Admin> adminList = adminMapper.selectList(null);
adminList = adminList.stream().peek(admin -> admin.setAdminState(null)).collect(Collectors.toList());

3 使用parallelStream注意事项

1.parallelStream是线程不安全的。

2.parallelStream适用的场景是CPU密集型的,只是做到别浪费CPU,假如本身电脑CPU的负载很大,那还到处用并行流,那并不能起到作用。I/O密集型 磁盘I/O、网络I/O都属于I/O操作,这部分操作是较少消耗CPU资源,一般并行流中不适用于I/O密集型的操作,就比如使用并流行进行大批量的消息推送,涉及到了大量I/O,使用并行流反而慢了很多。

3.在使用并行流的时候是无法保证元素的顺序的,也就是即使你用了同步集合也只能保证元素都正确但无法保证其中的顺序。

4 实战比较

4.1 代码如下

    /**
     * parallelStream()和stream()执行速度测试
     */
    @Test
    public void test6() {
        List<Integer> a = new ArrayList<>();
        for (int i = 0 ; i < 1000 ; i++) {
            a.add(i);
        }
        long b = System.currentTimeMillis();
        a.parallelStream().forEach(obj->{
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                log.error("出错:", e);
            }
            System.out.println(obj);
        });
        long c = System.currentTimeMillis();
        long d = System.currentTimeMillis();
        a.stream().forEach(obj->{
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                log.error("出错:", e);
            }
            System.out.println(obj);
        });
        long e = System.currentTimeMillis();
        System.out.println("并行耗时:" + (c-b));
        System.out.println("串行耗时:" + (e-d));
    }

4.2 执行结果

在这里插入图片描述

5 结论

由上述执行结果可知,parallelStream在同时执行一些耗时的方法时,执行时间要优于stream,但是使用时需要注意一些注意事项

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/975100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

是真卷?还是内耗?这次面试造的火箭着实有点离谱

大家好&#xff0c;我是冰河~~ 都说面试造火箭&#xff0c;工作拧螺丝&#xff0c;不过这次面试造的着实有点离谱&#xff01; 事情是这样的&#xff0c;昨天在冰河的知识星球微信群里&#xff0c;一名小伙伴发了一张面试常州一家公司的面试题的图片&#xff0c;瞬间吸引了我…

十个响应式页面项目

十个响应式页面项目 上接 53 个特效&#xff1a; 53 个 CSS 特效 153 个 CSS 特效 253 个 CSS 特效 3&#xff08;完&#xff09; 照例&#xff0c;预览地址在 http://www.goldenaarcher.com/html-css-js-proj/&#xff0c;git 地址&#xff1a; https://github.com/Goldena…

Seata处理分布式事务之1.7.0

https://blog.csdn.net/zhang33565417/article/details/122768300 1.5.0之后版本发生了很大改变 1.seata安装 1.1官网地址 http://seata.io/zh-cn/ 1.2下载地址 https://github.com/seata/seata/releases 下载的是seata-server-1.7.0.zip 1.3seata相关配置的修改 seata-…

Python学习 -- Math模块和Random模块

math 模块提供了许多数学函数&#xff0c;用于执行各种数学运算。以下是一些常用的 math 函数以及相应的示例代码&#xff1a; math.sqrt(x): 计算平方根。 import math x 25 square_root math.sqrt(x) print(f"√{x} {square_root}") math.pow(x, y): 计算 x …

好用的电容笔有哪些推荐?适合开学买电容笔推荐

尤其是在苹果品牌推出了专属Pencil系列之后&#xff0c;苹果原装的Pencil系列产品&#xff0c;更是将价格压到了所有人都无法企及的地步。市场上有不少可以替代苹果Pencil的平替电容笔&#xff0c;无论是做笔记还是专业的绘画&#xff0c;都完全足够了。在此&#xff0c;我将为…

电视盒子什么品牌好?数码博主盘点目前性能最好的电视盒子

电视盒子是非常重要的&#xff0c;老人小孩基本每天都会看电视&#xff0c;而电视盒子作为电视盒子的最佳拍档销量十分火爆&#xff0c;我自己每个月都会测评几次电视盒子&#xff0c;今天给大家详细解读一下电视盒子什么品牌好&#xff0c;看看目前性能最好的电视盒子是哪些&a…

电力智能监控系统

电力智能监控系统依托电易云-智慧电力物联网&#xff0c;利用计算机、计量保护装置和总线技术&#xff0c;对中、低压配电系统的实时数据、开关状态及远程控制进行了集中管理。该电力监控系统可以为企业提供"监控一体化"的整体解决方案&#xff0c;主要包括实时历史数…

AutoHotkey(AHK)脚本,自动截图当前屏幕并发送给微信窗口

前提先安装好 AutoHotkey &#xff0c;本脚本依赖AutoHotkey 环境 首先 &#xff0c;设置微信的快捷键 执行代码如下&#xff1a; Loop {SendInput, {Alt down}s{Alt up}Sleep, 2000 ; 等待2秒; 双击鼠标左键Click, 2Sleep, 1000 ; 等待1秒SendInput, {Alt down}a{Alt up}Sl…

systemverilog运行的时候调用系统函数运行python等

systemverilog 运行的时候使用系统函数 使用场景&#xff0c;在仿真过程中&#xff0c;需要外部环境准备仿真参数&#xff0c;或者调整仿真参数的时候 创建一个python文件 print("123")创建一个sv文件 module dut ;initial begin$system("python 123.py"…

【补充】助力工业物联网,工业大数据之AirFlow安装

【补充】助力工业物联网&#xff0c;工业大数据之AirFlow安装 直接在node1上安装 1、安装Python 安装依赖 yum -y install zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel openssl-static xz lzma xz-devel sqlit…

WebStorm软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 WebStorm是一款由JetBrains开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于开发Web应用程序。它支持多种前端技术&#xff0c;如HTML、CSS、JavaScript、TypeScript等&#xff0c;并提供了丰富的功能和工具&…

ICL7106芯片的特性、应用与重要性 | 百能云芯

ICL7106 是一种专用集成电路 (IC)&#xff0c;在模数转换中发挥着至关重要的作用。它是一种通用且广泛使用的 ADC&#xff0c;可在各种电子应用中提供高精度测量。下面小芯为您详细解析ICL7106 是什么、它的特性、应用及其在电子领域的重要性。 ICL7106 是 Intersil&#xff08…

记一次Nginx代理Mysql服务的经历

背景&#xff1a; 根据组长背景描述&#xff0c;具备以下前提 1. Mysql服务器为 某A云厂商的RDS SAAS服务&#xff0c;但是不开通外网服务 2. EC2 服务器一台&#xff0c;某A云厂商LaaS服务&#xff0c;也不开通外网 3.阿里云服务器一台&#xff0c;这台服务器有服务需要连…

巨人互动|游戏出海游戏出海效果怎样?

游戏出海是指将原本面向国内市场的游戏产品进行调整和优化&#xff0c;以适应海外市场的需求&#xff0c;并进行推广和销售。下面小编讲讲关于游戏出海对于游戏效果的影响的一些讨论点。 1、市场扩大 通过游戏出海&#xff0c;可以将游戏产品的目标受众从国内扩展到全球范围内…

博物学欣赏

自文艺复兴以降&#xff0c;西方开启发现世界的旅程。 这些东西对于科学、地理学、考古学、探险、旅游学、博物学、绘画学、美学无疑有着至高无上的借鉴价值。我们今天出版这些图文并茂的书籍有如斯高远的志向和目标&#xff1a; 展现自然的历史风貌 呈现万物的生态原样 复现…

nginx离线安装

ngixn的离线安装(centos7) 需要的依赖 gcc、gcc-c pcre-8.42.tar.gz zlib-1.2.11.tar.gz openssl-1.1.1s.tar.gz perl-5.28.0.tar.gz 在进行nginx离线安装时&#xff0c;首先查看系统是否安装 gcc、gcc-c&#xff0c;若没有进行安装&#xff0c;请先进行安装 gcc -v #查…

线程、并发相关---第五篇

系列文章目录 文章目录 系列文章目录一、并发的三大特性二、volatile一、并发的三大特性 原子性 原子性是指在一个操作中cpu不可以在中途暂停然后再调度,即不被中断操作,要不全部执行完成,要 不都不执行。就好比转账,从账户A向账户B转1000元,那么必然包括2个操作:从账户…

PMP备考过程和心得

23年还剩11月的考试&#xff0c;教材是第七版教材&#xff0c;也有可能增加连线题和填空题&#xff0c;要做好题型变化的准备。现在可以将英文报名先报了。 第七版教材 第七版再度升级&#xff0c;不否认前几版的基于过程的方法&#xff0c;强调项目不只是产生输出&#xff0…

【OpenCV入门】第二部分——Numpy模块

写在前面&#xff1a; 这个部分是Numpy模块与OpenCV有关的部分。如果想了解Numpy库是什么&#xff0c;或者想要直接单独学习Numpy库&#xff0c;可以看看我以前写的这篇Numpy学习笔记。一些内容如数组类型、数组创建、数组运算和数组索引在链接文章里有&#xff0c;就不在这里赘…

SQL注入绕过实战案例一

目录 一、SQL-LAB靶场搭建 1、搭建环境 2、开启nginx和mysql 3、将下载好的sal-labs靶场将压缩文件解压至phpstudy的www目录下 4、查看mysql密码&#xff0c;将其修改值靶场配置文件中 5、配置网站 6、完成后我们就可以在浏览器输入127.0.0.1&#xff1a;8090进入靶场 二…