Java之stream流浅析
Stream流是Java8中提供的一个重要新特性,它允许开发人员以声明方式处理集合。其中parallelStream其实就是一个并行执行的流,它通过默认的ForkJoinPool,可能提高你的多线程任务的速度。
Stream流特点如下
- stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果;
- stream不会改变数据源,通常情况下会产生一个新的集合;
- stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行;
- stream不可复用,对一个已经进行了终端操作的流再次调用会抛出异常;
Stream流接口中定义了许多对于集合的操作方法,主要分为两类:中间操作和终端操作。
- 中间操作:返回一个流,通过这种方式可以将多个中间操作连接起来,形成一个调用链,从而转换为另一个流。除非调用链后存在一个终端操作,否则中间操作对流不会进行任何结果处理。
- 终端操作:返回一个具体的结果,如list等。
常见的中间操作方法有:limit、skip、distinct、sorted等。
常见的终端操作方法有:forEach、count、toArray、reduce等。
常见的收集操作方法有:collect。
使用Stream流的方式操作完毕后,通过收集方法collect将数据收集到集合中,工具类Collectors提供了具体的收集方式,如下
- toList:把元素收集到List集合中;
- toSet:把元素收集到Set集合中;
- toMap:把元素收集到Map集合中;
Stream性能
- 在少数据量场景(size<1000)
stream流的foreach处理效率不如iterator迭代的效率,但实际上这些处理任务本身运行实际都低于毫秒,这点效率的差距对普通业务几乎没有影响,而stream流却可以使得代码更简单优雅; - 在多数据量场景(size>10000)
stream流的foreach处理效率高于iterator迭代的效率,特别是使用了并行流,在cpu恰好将线程分配到多个核心的条件下,效率很高。 - parallelStream并行流
parallelStream受cpu环境影响很大,当没分配到多个cpu核心时,加上引入了forkJoinPool的开销,运行效率还不如stream流。
下面分别对for循环、foreach循环、stream.foreach循环、parallelStream.foreach循环的性能进行测试
public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();for (int i = 0; i < 1000; i++) {list.add(i);}Long startTime = System.currentTimeMillis();forMethod(list);Long endTime = System.currentTimeMillis();System.out.println("result:" + (endTime - startTime));//29 15 31 15 16}private static void forMethod(List<Integer> list) {for (Integer i : list) {System.out.println("------" + i);}}
public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();for (int i = 0; i < 1000; i++) {list.add(i);}Long startTime = System.currentTimeMillis();foreachMethod(list);Long endTime = System.currentTimeMillis();System.out.println("result:" + (endTime - startTime));//85 80 84 84 85}private static void foreachMethod(List<Integer> list) {list.forEach(integer -> {System.out.println("------" + integer);});}
public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();for (int i = 0; i < 1000; i++) {list.add(i);}Long startTime = System.currentTimeMillis();streamMethod(list);Long endTime = System.currentTimeMillis();System.out.println("result:" + (endTime - startTime));//116 115 85 84 84}private static void streamMethod(List<Integer> list) {list.stream().forEach(integer -> {System.out.println("------" + integer);});}
public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();for (int i = 0; i < 1000; i++) {list.add(i);}Long startTime = System.currentTimeMillis();parallelStreamMethod(list);Long endTime = System.currentTimeMillis();System.out.println("result:" + (endTime - startTime)); //179 138 140 122 175}private static void parallelStreamMethod(List<Integer> list) {list.parallelStream().forEach(integer -> {System.out.println("------" + integer);});}
在数据量为1000时,效率依次是for>foreach>stream.foreach>parallelStream.foreach。
理论上,数据量越大,stream的效率越高,parallelStream的效率会最高且是并行处理。但选用需思考其场景,避免数据安全问题。
Java之stream流浅析相关推荐
- Java 8 - Stream流骚操作解读2_归约操作
文章目录 Pre 什么是归约操作 元素求和 reduce reduce如何运行的 最大值和最小值 Pre Java 8 - Stream流骚操作解读见到过的终端操作都是返回一个 boolean ( a ...
- Java 8 Stream 流用法及语法
Java 8 Stream 流用法 1.简介 Stream流 最全的用法 Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据 ...
- 函数式编程(JAVA)——Stream流
函数式编程(JAVA)--Stream流 概述 Java8的Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合或数组进行链状流式的操作.可以更方便的让我们对集合或数组操作. 下述 ...
- Java 8 Stream流 的用法
Java 8 Stream流 什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需 ...
- 对比Java的Stream流和C# 的Linq
Java由于没有委托的概念,所以用函数式接口 @FunctionalInterface 与 lambda表达式相结合,实现了类似于C# 中委托,C++中函数指针的功能. 函数指针/委托在Java中被命 ...
- Java 8 - Stream流骚操作解读
文章目录 分类 中间操作 终端操作 使用Stream流 筛选和切片 用谓词筛选 filter 筛选各异的元素 distinct 截短流 limit 跳过元素 skip 映射 对流中每一个元素应用函数 ...
- [Java基础]Stream流的收集操作
代码如下: package CollectPack;import java.util.*; import java.util.stream.Collectors; import java.util.s ...
- [Java基础]Stream流的常见中间操作方法
代码如下: package StreamTest;import java.util.ArrayList;public class StreamDemo02 {public static void ma ...
- [Java基础]Stream流的常见生成方式
1.Collection体系的集合可以使用默认方法stream()生成流 default Stream< E > stream() 代码如下: package StreamTest;imp ...
最新文章
- [问题解决] Python中 == 与 is 的区别
- GridView实现用...代替超长字符串
- ubuntu各版本代号(更新至15.04)及各版本下载地址等
- 104. 二叉树的最大深度 golang DFS
- 矩池云上使用nohup和让任务后台运行
- 计算机网络数据链路层的错误检测与纠正之海明码的生成,解码
- mysql 数据导入导出说明
- powershell 更改为Oh-my-zsh
- 编写一个程序,将用户输入的由数字字符和非数字字符组成的字符串中的数字提取出来(例如:输入asd123,34fgh_566kkk789,则产生的数字分别是123、34、789)。
- mysql binlog提取sql_导出mysqlbinlog语句
- linux中的cd命令是什么意思,linux中cd命令的详细解释
- 【信奥赛一本通】1378:最短路径(shopth)(详细代码)
- 又是白嫖Gitee的一天,PicGo+Gitee搭建图床,用过的都说真香!!!
- ios html调起高德地图,iOS开发笔记 调起本地地图导航(百度、高德、腾讯、苹果自带)...
- 2022年前端面试题总结
- 如何打造优秀的个人博客
- linux下脚本录制工具——script和scriptreplay
- matlab化学程序,Matlab在化学的应用
- Java 随手写的一个英语单词练习器
- Spark2.3.2源码解析: 5. SparkConf源码分析
热门文章
- 海狮号水下机器人_「揭晓」水下机器人哪家强?冠军出炉了
- 【学习笔记】韦东山freertos直播学习笔记
- gvoice缺少arm64的so文件
- Unity修改默认脚本编辑器
- 华为交换机对接城市热点实现MAC优先的portal接入认证+无感知登录
- zotero+阿里云盘+aliyun driver 实现文献管理云存储
- 老板喜欢什么样的员工
- Internet Explorer 11: “请不要再叫我 IE”
- [开源] 分享自己用的 GitHub 分组管理工具.
- kindlegen php调用,epub – 来自Kindlegen的MOBI输出中内部链接/锚点的问题