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

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()执行速度测试*/@Testpublic 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.hqwc.cn/news/98459.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.网络空间搜素引擎

网络空间搜素引擎 https://cybermap.kaspersky.com/cn 世界所以带有ip的网络设备互联组成的空间叫做网络空间 地址 &#xff1a;shodan.io 简介 &#xff1a; 这句话还是有点东西得 。 区别&#xff1a; 平常得搜素引擎主要搜网页&#xff0c;shadan可以搜所以带有ip地址…

计算机网络自顶向下-web页面请求历程

1. 准备: DHCP、 UDP、 IP 和以太网 假定 Bob 启动他的便携机&#xff0c;然后将其用一根以太网电缆连接到学校的以太网交换机 &#xff0c; 交换机与学校的路由器相连。学校的路由器与一个 ISP 连接&#xff0c; 本例中 ISP 为 comcast.net &#xff0c;为学校提供了 DNS 服务…

1780_添加鼠标右键空白打开命令窗功能

全部学习汇总&#xff1a; GitHub - GreyZhang/windows_skills: some skills when using windows system. 经常执行各种脚本&#xff0c;常常需要切换到命令窗口中输入相关的命令。从开始位置打开cmd然后切换目录是个很糟糕的选择&#xff0c;费时费力。其实Windows 7以及Windo…

【深度学习实验】数据可视化

目录 一、实验介绍 二、实验环境 三、实验内容 0. 导入库 1. 归一化处理 归一化 实验内容 2. 绘制归一化数据折线图 报错 解决 3. 计算移动平均值SMA 移动平均值 实验内容 4. 绘制移动平均值折线图 5 .同时绘制两图 6. array转换为tensor张量 7. 打印张量 一、…

mysql基于AES_ENCRYPTAES_DECRYPT实现密码的加密与解密

1.直接使用AES_ENCRYPT&&AES_DECRYPT函数导致的问题。 执行语句 select AES_ENCRYPT(cd123,key) 结果 加密过后的字符串是一串很奇怪的字符。 尝试使用上面加密过后的字符解密。 select AES_DECRYPT(u5£d|#,key) 结果 并未成功的解密 2.解决办法 使用 hex(…

Flutter 完美的验证码输入框 转载

刚开始看到这个功能的时候一定觉得so easy&#xff0c;开始的时候我也是这么觉得的&#xff0c;这还不简单&#xff0c;然而真正写的时候才发现并没有想象的那么简单。 先上图&#xff0c;不上图你们都不想看&#xff0c;我难啊&#xff0c;到Github&#xff1a; https://gith…

BCSP-玄子Share-Java框基础_反射

一、反射 1.1 反射介绍 Java反射&#xff1a;在编译时不确定哪个类被加载&#xff0c;而在程序运行时才加载、探知、使用 1.1.1 Java 程序的运行过程 1.1.2 反射及其作用 反射是指能够在运行时&#xff0c;观察并修改自己运行时(Runtime)行为的特性 Java 反射机制主要提供了…

svn checkout 报 ‘svn: E000061: 执行上下文错误: Connection refused‘

问题 svn: E170013svn: E000061 ➜ svn svn checkout https://xxx.xxx.xxx.xxx:9443/svn/project-xxx/ svn: E170013: Unable to connect to a repository at URL https://xxx.xxx.xxx.xxx:9443/svn/project-xxx svn: E000061: 执行上下文错误: Connection refused链接在浏览…

说说Lambda架构

分析&回答 Lambda架构是由Storm的作者Nathan Marz提出的一个实时大数据处理框架。Marz在Twitter工作期间开发了著名的实时大数据处理框架Storm&#xff0c;Lambda架构是其根据多年进行分布式大数据系统的经验总结提炼而成。Lambda架构的目标是设计出一个能满足实时大数据系…

大模型优化:RAG还是微调?

引言 随着人们对大型语言模型 (LLM) 的兴趣激增&#xff0c;许多开发人员和组织正忙于利用其能力构建应用程序。然而&#xff0c;当开箱即用的预训练LLM没有按预期或希望执行时&#xff0c;如何提高LLM申请的性能的问题。最终我们会问自己&#xff1a;我们应该使用检索增强生成…

微服务容错 Resilience4j 接口服务-容错原理

微服务容错 Resilience4j 容错原理 4.1 微服务容错简介 在⾼并发访问下&#xff0c;⽐如天猫双11&#xff0c;流量持续不断的涌⼊&#xff0c;服务之间的相互调⽤频率突然增加&#xff0c;引发系统负载过⾼&#xff0c;这时系统所依赖的服务的稳定性对系统的影响⾮常⼤&#…

大厂面试 | 百度一面,顶不住

题目来源&#xff1a;https://www.nowcoder.com/feed/main/detail/d39aabc0debd4dba810b4b9671d54348 前文 本期是【捞捞面经】系列文章的第 2 期&#xff0c;持续更新中…。&#xff08;更多与往期下方仓库直达&#xff09; 《捞捞面经》系列正式开始连载啦&#xff0c;据说看…