点击上方 "编程技术圈"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

日英文

It all comes to the end about the past and you.For the future,about me,to be continued.When the whole world is about to rain, let’s make it clear in our heart together.

关于过去,关于你,告一段落。 关于未来,关于我,敬请期待。当全世界约好一起下雨,让我们约好一起在心里放晴。

每日掏心话

最闹心的烦躁是你根本不知道自己究竟在烦什么,无缘无故就全身负能量爆棚。

责编:乐乐 | 来自:Al_assad链接:blog.csdn.net/Al_assad/article/details/82356606

编程技术圈(ID:study_tech)第 1231 次推文

往日回顾:公司领导网上自曝:"真不想招35岁以上的基层员工!"网友怒了…

     

   正文   

Stream 是Java SE 8类库中新增的关键抽象,它被定义于 java.util.stream (这个包里有若干流类型:Stream<T> 代表对象引用流,此外还有一系列特化流,如 IntStream,LongStream,DoubleStream等 )。
Java 8 引入的的Stream主要用于取代部分Collection的操作,每个流代表一个值序列,流提供一系列常用的聚集操作,可以便捷的在它上面进行各种运算。集合类库也提供了便捷的方式使我们可以以操作流的方式使用集合、数组以及其它数据结构;
stream 的操作种类
① 中间操作
当数据源中的数据上了流水线后,这个过程对数据进行的所有操作都称为“中间操作”;
中间操作仍然会返回一个流对象,因此多个中间操作可以串连起来形成一个流水线;
stream 提供了多种类型的中间操作,如 filter、distinct、map、sorted 等等;
②终端操作
当所有的中间操作完成后,若要将数据从流水线上拿下来,则需要执行终端操作;
stream 对于终端操作,可以直接提供一个中间操作的结果,或者将结果转换为特定的 collection、array、String 等;
这一部分详细的说明可以参见:JDK8 Stream 详细使用stream 的特点① 只能遍历一次:
数据流的从一头获取数据源,在流水线上依次对元素进行操作,当元素通过流水线,便无法再对其进行操作,可以重新在数据源获取一个新的数据流进行操作;
② 采用内部迭代的方式:
对Collection进行处理,一般会使用 Iterator 遍历器的遍历方式,这是一种外部迭代;
而对于处理Stream,只要申明处理方式,处理过程由流对象自行完成,这是一种内部迭代,对于大量数据的迭代处理中,内部迭代比外部迭代要更加高效;
stream 相对于 Collection 的优点
无存储:
流并不存储值;流的元素源自数据源(可能是某个数据结构、生成函数或I/O通道等等),通过一系列计算步骤得到;函数式风格:对流的操作会产生一个结果,但流的数据源不会被修改;
惰性求值:
多数流操作(包括过滤、映射、排序以及去重)都可以以惰性方式实现。这使得我们可以用一遍遍历完成整个流水线操作,并可以用短路操作提供更高效的实现;
无需上界:
不少问题都可以被表达为无限流(infinite stream):用户不停地读取流直到满意的结果出现为止(比如说,枚举 完美数 这个操作可以被表达为在所有整数上进行过滤);集合是有限的,但流可以表达为无线流;
代码简练:对于一些collection的迭代处理操作,使用 stream 编写可以十分简洁,如果使用传统的 collection 迭代操作,代码可能十分啰嗦,可读性也会比较糟糕;stream 和 iterator 迭代的效率比较好了,上面 stream 的优点吹了那么多,stream 函数式的写法是很舒服,那么 steam 的效率到底怎样呢?先说结论:
传统 iterator (for-loop) 比 stream(JDK8) 迭代性能要高,尤其在小数据量的情况下;在多核情景下,对于大数据量的处理,parallel stream 可以有比 iterator 更高的迭代处理效率;
我分别对一个随机数列 List (数量从 10 到 10000000)进行映射、过滤、排序、规约统计、字符串转化场景下,对使用 stream 和 iterator 实现的运行效率进行了统计,测试代码 基准测试代码链接
测试环境如下:
System:Ubuntu 16.04 xenial
CPU:Intel Core i7-8550U
RAM:16GB
JDK version:1.8.0_151
JVM:HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
JVM Settings:-Xms1024m-Xmx6144m-XX:MaxMetaspaceSize=512m-XX:ReservedCodeCacheSize=1024m-XX:+UseConcMarkSweepGC-XX:SoftRefLRUPolicyMSPerMB=1001. 映射处理测试
把一个随机数列(List<Integer>)中的每一个元素自增1后,重新组装为一个新的 List<Integer>,测试的随机数列容量从 10 - 10000000,跑10次取平均时间;
//stream
List<Integer> result = list.stream()
.mapToInt(x -> x)
.map(x -> ++x)
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
//iterator
List<Integer> result = new ArrayList<>();
for(Integer e : list){result.add(++e);
}
//parallel stream
List<Integer> result = list.parallelStream()
.mapToInt(x -> x)
.map(x -> ++x)
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
2. 过滤处理测试
取出一个随机数列(List<Integer>)中的大于 200 的元素,并组装为一个新的 List<Integer>,测试的随机数列容量从 10 - 10000000,跑10次取平均时间;
搜索公众号后端架构师后台回复“架构整洁”,获取一份惊喜礼包。
//stream
List<Integer> result = list.stream()
.mapToInt(x -> x)
.filter(x -> x > 200)
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
//iterator
List<Integer> result = new ArrayList<>(list.size());
for(Integer e : list){if(e > 200){result.add(e);}
}
//parallel stream
List<Integer> result = list.parallelStream()
.mapToInt(x -> x)
.filter(x -> x > 200)
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
3. 自然排序测试
对一个随机数列(List<Integer>)进行自然排序,并组装为一个新的 List<Integer>,iterator 使用的是 Collections # sort API(使用归并排序算法实现),测试的随机数列容量从 10 - 10000000,跑10次取平均时间;
//stream
List<Integer> result = list.stream()
.mapToInt(x->x)
.sorted()
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
//iterator
List<Integer> result = new ArrayList<>(list);
Collections.sort(result);
//parallel stream
List<Integer> result = list.parallelStream()
.mapToInt(x->x)
.sorted()
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
4. 归约统计测试
获取一个随机数列(List<Integer>)的最大值,测试的随机数列容量从 10 - 10000000,跑10次取平均时间;
//stream
int max = list.stream()
.mapToInt(x -> x)
.max()
.getAsInt();
//iterator
int max = -1;
for(Integer e : list){if(e > max){max = e;}
}
//parallel stream
int max = list.parallelStream()
.mapToInt(x -> x)
.max()
.getAsInt();
5. 字符串拼接测试
获取一个随机数列(List<Integer>)各个元素使用“,”分隔的字符串,测试的随机数列容量从 10 - 10000000,跑10次取平均时间;
//stream
String result = list.stream().map(String::valueOf).collect(Collectors.joining(","));
//iterator
StringBuilder builder = new StringBuilder();
for(Integer e : list){builder.append(e).append(",");
}
String result = builder.length() == 0 ? "" : builder.substring(0,builder.length() - 1);
//parallel stream
String result = list.stream().map(String::valueOf).collect(Collectors.joining(","));
6. 混合操作测试对一个随机数列(List<Integer>)进行去空值,除重,映射,过滤,并组装为一个新的 List<Integer>,测试的随机数列容量从 10 - 10000000,跑10次取平均时间;//stream
List<Integer> result = list.stream()
.filter(Objects::nonNull)
.mapToInt(x -> x + 1)
.filter(x -> x > 200)
.distinct()
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
//iterator
HashSet<Integer> set = new HashSet<>(list.size());
for(Integer e : list){if(e != null && e > 200){set.add(e + 1);}
}
List<Integer> result = new ArrayList<>(set);
//parallel stream
List<Integer> result = list.parallelStream()
.filter(Objects::nonNull)
.mapToInt(x -> x + 1)
.filter(x -> x > 200)
.distinct()
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
实验结果总结
从以上的实验来看,可以总结处以下几点:
在少低数据量的处理场景中(size<=1000),stream 的处理效率是不如传统的 iterator 外部迭代器处理速度快的,但是实际上这些处理任务本身运行时间都低于毫秒,这点效率的差距对普通业务几乎没有影响,反而 stream 可以使得代码更加简洁;
在大数据量(szie>10000)时,stream 的处理效率会高于 iterator,特别是使用了并行流,在cpu恰好将线程分配到多个核心的条件下(当然parallel stream 底层使用的是 JVM 的 ForkJoinPool,这东西分配线程本身就很玄学),可以达到一个很高的运行效率,然而实际普通业务一般不会有需要迭代高于10000次的计算;Parallel Stream 受引 CPU 环境影响很大,当没分配到多个cpu核心时,加上引用 forkJoinPool 的开销,运行效率可能还不如普通的 Stream;
使用 Stream 的建议
简单的迭代逻辑,可以直接使用 iterator,对于有多步处理的迭代逻辑,可以使用 stream,损失一点几乎没有的效率,换来代码的高可读性是值得的;单核 cpu 环境,不推荐使用 parallel stream,在多核 cpu 且有大数据量的条件下,推荐使用 paralle stream;
stream 中含有装箱类型,在进行中间操作之前,最好转成对应的数值流,减少由于频繁的拆箱、装箱造成的性能损失;PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!欢迎加入后端架构师交流群,在后台回复“学习”即可。最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。
别找了,想获取史上最简单的Java大厂面试题学习资料
扫下方二维码回复「面试」就好了猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
我差点信了......面试官:Java 反射是什么?我回答不上来!12 个非常适合做外包项目的开源后台管理系统嘿,你在看吗?

JDK8 Stream 效率如何?看了都说好!相关推荐

  1. JDK8 Stream 效率如何?

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 作者:Al_assad 链接: ...

  2. JDK8 Stream 数据流效率分析

    JDK8 Stream 数据流效率分析 Stream 是Java SE 8类库中新增的关键抽象,它被定义于 java.util.stream (这个包里有若干流类型: Stream<T> ...

  3. python都学什么啊-那些效率高的人都在偷偷学什么?

    原标题:那些效率高的人都在偷偷学什么? 提起潘石屹,你的印象是不是还停留在"SOHO中国"."房产大亨"的标签上?那你真是"图样图森破"! ...

  4. JDK8 stream API,并行API的适用场合

    jdk8stream创建/中间操作/终止操作api public static void main(String[] args) {//流的创建:可以通过Array/List/Set的stream() ...

  5. jdk8 stream

    JDK8 Stream详解 概念 Stream是Java8 API的新成员,它允许以声明性方式处理数据集合 . 特点 (1)代码简洁:函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告 ...

  6. 程序员看过都说好的资源网站,看看你都用过哪些?

    程序员必备的相关资源网站 一.图片专区 1.表情包 (1)发表情 (2)逗比拯救世界 (3)搞怪图片生成 (4)哇咔工具 2.图标库 (1)Font Awesome (2)iconfont 3.高清图 ...

  7. 分库分表 PK NewSQL数据库!看了都说好!

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Sometimes people only change because o ...

  8. 微服务架构-设计总结,看了都说好!

    点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Sometimes, the same thing, we can ...

  9. python语法基础学习-Python基础语法精心总结!看完都知道的可以往下继续学习了...

    原标题:Python基础语法精心总结!看完都知道的可以往下继续学习了 这应该是最详细的Python入门基础语法总结! 定义变量,使用变量 1. input 用户自己输入值 2. print 打印值 可 ...

  10. 《看聊天记录都学不会C#?太菜了吧》(6)多晦涩的专业术语原来都会那么简单

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将 ...

最新文章

  1. CCNA培训课总结笔记--交换机的基本配置(十三)
  2. 放弃深圳1.5万月薪,我准备回农村了!
  3. FreeMarker中文帮助手册API文档,基础入门学习文档
  4. App Store 状态列表
  5. 051_Unicode字符官方标准二
  6. swf缓存文件在哪里_面试官:mybatis一级缓存二级缓存的区别都不知道,知道门在哪吧...
  7. 路由器DHCP和DHCP中继的配置
  8. python处理excel的优势-Python处理Excel数据的坑,一文让你不用重复犯错
  9. linux网络编程之posix线程(二)
  10. python——迭代器itertools.cycle
  11. 会员管理系统,建议收藏!
  12. 利用阿里云免费镜像仓库,实现微服务的k8s部署
  13. 当一个SQL语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序...
  14. WPF 基于 WER 注册应用崩溃无响应回调和重启方法
  15. 苟延残喘,回光返照:从Cheetah 10K.7到Cheetah NS
  16. 企业为什么要先上ERP?
  17. NYOJ1036 非洲小孩
  18. 防黑客攻击手法之APP安全防护
  19. 南京信息工程大学本科毕业论文答辩和论文选题PPT模板
  20. 优麒麟系统调整启动项顺序的经验分享

热门文章

  1. 百度糯米 android,百度糯米安卓版|百度糯米for android官方手机版 6.7.1 - 系统天堂...
  2. “中国会员电商第一股”云集的反爬虫攻防战 | 产业安全专家谈
  3. CSS 权威指南 读书笔记(五)
  4. 表白神器!程序员七夕情人节源码合集
  5. xp系统粘贴是灰色的_电脑无法复制粘贴,教你电脑无法复制粘贴怎么解决
  6. 漫画:鉴权与安全访问控制的技术血脉
  7. 打包时错误 Entry name ‘classes.dex‘ collided 的解决办法
  8. 如何使用Hyper-V Manager和Powershell合并Hyper-V检查点
  9. MySQLSyntaxException:FUNCTION xxxxxxxx.JSON_EXTRACT does not exist
  10. 群晖 Docker Gitlab 安装 及 https配置