Java Stream流封装速度竟然如此给力!

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,博客昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…


一、Stream序言

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。

使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。
在这里插入图片描述

简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。


二、Stream测试

项目案例:第一次接触Java-Stream流,记得当时要查询帖子列表,本身查询就是三个表的连表查询外,还要封装点赞,是否点赞,等等一系列属性,用传统的for循环封装速度太慢了,会带给用户不好体验,于是一个大佬帮我优化了一下代码用stream流帮我封装等一系列属性时间也节省了三分之二的时间

爱了爱了,来找找网上案例一起尝试学习一下

在这里插入图片描述

整理了一下常见的for循环foreach等等和stream流的比较

public class Test {
    public static void main(String[] args) {
        // 测试源
        List<String> sourceList = new ArrayList<>();
        for (int i = 0;i<10000;i++) {
            sourceList.add("第" + i + "条数据");
        }
        System.out.println("数据条数:" + sourceList.size());
        long a1=System.currentTimeMillis();
        for (int i = 0;i < sourceList.size();i++) {
            doSome();
        }
        long a2=System.currentTimeMillis();
        System.out.println("普通for循环用时:" + (a2-a1));


        long b1=System.currentTimeMillis();
        for (String t:sourceList) {
            doSome();
        }
        long b2=System.currentTimeMillis();
        System.out.println("增强for循环用时:" + (b2-b1));

        long c1=System.currentTimeMillis();
        sourceList.forEach((t)-> doSome());
        long c2=System.currentTimeMillis();
        System.out.println("forEach循环用时:" + (c2-c1));

        long d1=System.currentTimeMillis();
        sourceList.parallelStream().forEach((t)-> doSome());
        long d2=System.currentTimeMillis();
        System.out.println("forEach-Stream循环用时:" + (d2-d1));



    }
    private static void doSome() {
        try {
            Thread.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

当我们数据是一万条的时候可以发现forEach-Stream流明显的速度优势

数据条数:10000
普通for循环用时:19804
增强for循环用时:19645
forEach循环用时:19707
forEach-Stream循环用时:3702

数据量比较小的时候好像看不到明显的优势

数据条数:10
普通for循环用时:21
增强for循环用时:20
forEach循环用时:62
forEach-Stream循环用时:27

三、Stream小结

JDK1.8的stream流操作和for循环操作到底谁的性能高?

如果在循环体中有复杂的业务、调用远程接口或数据库就用stream,因为stream是多线程方式并行执行,但是其调用线程池必然会消耗性能,所以简单的操作固然还是for循环效率高。具体的应用我们更加具体的业务场景来。

stream().forEach用的多线程方式,其调用线程池的时候必然会耗费更多的时间。但如果你在循环内要处理的事情很多,或者要循环调用远程接口/数据库的时候,无疑极大的提升了效率

在编写代码的过程中,我们究竟采用哪种遍历方式比较好?!

这个得有一个选择标准,如果单纯的以运行效率为主,那还是采用传统的for循环,若要简化代码量,那就选用stream。


使用 Stream 的建议

  • 1、简单的迭代逻辑,可以直接使用 iterator,对于有多步处理的迭代逻辑,可以使用 stream,损失一点几乎没有的效率,换来代码的高可读性是值得的;

  • 2、单核 cpu 环境,不推荐使用 parallel stream,在多核 cpu 且有大数据量的条件下,推荐使用 paralle stream;

  • 3、stream 中含有装箱类型,在进行中间操作之前,最好转成对应的数值流,减少由于频繁的拆箱、装箱造成的性能损失;


Stream小结

我们可以把Stream当成一个高级版本的Iterator。原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“封装某些属性”、“过滤长度小于3的字符串”、“获取每个字符串的首字母”等,具体的操作还是要进一步学习Stream流的相关用法,值得学习实践。


The best investment is to invest in yourself.

在这里插入图片描述

2020.11.24 晚22:48 愿你们奔赴在自己的热爱里!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值