本篇文章给大家谈谈Java 8中用法优雅的Stream,性能也“优雅”吗,以及java中不建议使用stream对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
本文目录
- java8 stream和foreach哪个效率高
- Java 8中用法优雅的Stream,性能也“优雅”吗
- java中,DataInputStream和FileInputStream有什么区别和联系怎么转换
- stream流的使用方法
java8 stream和foreach哪个效率高
1.问题描述
java8stream和foreach哪个效率高?
问题结论
150W条数据以上:stream>paralleStream>simple
150W条数据以下:simple>stream>paralleStream
从性能上考虑:小数据量用普通的forEach就可以,没有必要使用java8中的新出来的几种,已经在项目中使用的也不需要改回来,10W条也就几毫秒的差距。
2.测试用例
importjava.util.ArrayList;
importjava.util.List;
publicclassForEachMain{
publicstaticvoidmain(String[]args){
//实例化arrayList
List<Integer>arrayList=newArrayList<Integer>();
intnum=15000000;
//插入10万条数据
for(inti=0;i<num;i++){
arrayList.add(i);
}
List<Integer>res=newArrayList<>();
res.clear();
//用foreach循环arrayList
longarrayForeachStartTime=System.currentTimeMillis();
for(Integerin:arrayList){
res.add(in);
}
longarrayForeachEndTime=System.currentTimeMillis();
System.out.println(
"用foreach循环arrayList"+(num)+"次花费时间:"+(arrayForeachEndTime-arrayForeachStartTime)+"毫秒");
res.clear();
//用stream-foreach循环arrayList
longarrayStreamStartTime=System.currentTimeMillis();
arrayList.stream().forEach(e->res.add(e));
longarrayStreamEndTime=System.currentTimeMillis();
System.out.println(
"用Stream-foreach循环arrayList"+(num)+"次花费时间:"+(arrayStreamEndTime-arrayStreamStartTime)+"毫秒");
res.clear();
//用parallelStream-foreach循环arrayList
longarrayParallelStreamStartTime=System.currentTimeMillis();
arrayList.parallelStream().forEach(e->res.add(e));
longarrayParallelStreamEndTime=System.currentTimeMillis();
System.out.println("用parallelStream-foreach循环arrayList"+(num)+"万次花费时间:"
+(arrayParallelStreamEndTime-arrayParallelStreamStartTime)+"毫秒");
}
}
2.1当num=50000000时
用foreach循环arrayList5000万次花费时间:2840毫秒
用stream-foreach循环arrayList5000万次花费时间:507毫秒
用parallelStream-foreach循环arrayList5000万次花费时间:1168毫秒
2.2当num=500000时
用foreach循环arrayList50万次花费时间:13毫秒
用stream-foreach循环arrayList50万次花费时间:25毫秒
用parallelStream-foreach循环arrayList50万次花费时间:35毫秒
2.3当num=5000时
用foreach循环arrayList5000次花费时间:1毫秒
用stream-foreach循环arrayList0万次花费时间:16毫秒
用parallelStream-foreach循环arrayList0万次花费时间:8毫秒
最直观的感觉,stream的流式处理应该比较快,这种想当然的推测,需要事实去佐证,运行过测试代码之后,发现并不是那么回事。耳听为虚,眼见为实,李子是不是涩的,最简单的方式是尝一口。请记住,编写代码时,一定要以最简洁为原则,毕竟运行程序的硬件成本会随着时间的推移在不断降低。
作者:夕阳雨晴,欢迎关注我的头条号:偶尔美文,主流Java,为你讲述不一样的码农生活。
Java 8中用法优雅的Stream,性能也“优雅”吗
本人历经了Java6~java8的“改朝换代”,说说自己的看法。
首先,不可否认,stream绝对是优雅的代名词,无论是其串行调用方式,还是其api的强大能力,都给予了程序员一项特殊技能:高效、简洁。
但事情并非绝对,但从性能上来说,stream真的比传统迭代更优吗?其实不然,还是要依据实际情况来看待问题。
在极少数量的迭代次数下,其实看不出性能效果的差异,固后面所说的几点都是依赖大量数据迭代的前提之下。
具体分为以下几点谈谈:
1、无论什么程序,都要跑在载体上,而常见的载体就是服务器,那么,提到这就很容易联想到,CPU的处理能力,直接影响到性能问题。
如果只是单核cpu,那么还是推荐传统迭代,a)实际测试效果来看,stream性能要明显差于for循环之类的传统处理方式,尤其在单核cpu时,千万不要使用stream的并线处理,原因是并行处理时还有另外一项开销,就是上下文线程切换,而此时只有单核cpu,你说这是不是“没事找事”;
b)当cpu是多核时,并且随着核数的增加,这时,stream的优势才能逐渐显示出来,毕竟并行处理还是由于串行的。
2、事情不是绝对,不是所有情况下,串行处理时stream都不如传统迭代。比如在复杂对象的处理时(常见的有订单对象,里面包含很多信息),经测试结果发现,stream性能还是由于普通迭代的,那更不用说,在多核cpu下的并行处理了,此处再次强调,不要在单核下使用串行,你会发现性能及其查!
3、最后提一点个人经历,在使用并行stream时,要谨慎对待迭代处理中进行多外部接口调用,可能你会发现并行后因为上下文线程切换带来的开销反而不一定性能更优于串行,还会给系统稳定性带来一定影响。
最后总结一下,处于代码整洁上考虑,stream还是有明显优势的,但是在性能上,大家还是要依据实际情况来做出合理选择,这样才能写出最“优雅”的代码。
以上3点均为个人见解和日常工作所碰到实际场景的总结,若有不对或者见解不一的地方,大家可以留言指出,一起探讨,一起进步。
java中,DataInputStream和FileInputStream有什么区别和联系怎么转换
DataInputStream(简称Data)和FileInputStream(简称File)两者都是inputStream的子类,但是他们的父类不同,Data的父类是FilterInputStream,而File的父类是inputStream,形象一点也就是说,Data的爷爷才是File的爸爸,File中的方法针对读取文件,并把文件的字符内容以数据流的形式读取到内存中便于进行进一步处理,这个过程中涉及到流的封装,例如:DataInputStreamin=newDataInputStream(newFileInputStream("Java2s.txt"));使用File来加载一个文件,然后使用Data对File进行封装。
stream流的使用方法
1.Stream流的使用方法是非常灵活和方便的。2.首先,Stream流是Java8引入的一种新的数据处理方式,它可以对集合或数组进行一系列的操作,如过滤、映射、排序等。使用Stream流可以大大简化代码,提高代码的可读性和可维护性。3.在使用Stream流时,首先需要获取一个Stream对象,可以通过集合的stream()方法或数组的stream()方法来获取。然后,可以通过一系列的中间操作对数据进行处理,如filter()方法用于过滤数据,map()方法用于映射数据,sorted()方法用于排序数据等。最后,可以通过终端操作对处理后的数据进行操作,如forEach()方法用于遍历数据,collect()方法用于将数据收集到集合中等。Stream流的使用方法非常灵活,可以根据具体的需求进行组合和操作。同时,Stream流还支持并行处理,可以充分利用多核处理器的优势,提高程序的执行效率。因此,掌握Stream流的使用方法对于Java开发人员来说是非常重要的。
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!