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

简介: 案例入门学习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.

在这里插入图片描述

愿你们奔赴在自己的热爱里!

目录
相关文章
|
13天前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
59 15
|
2月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
89 6
|
2月前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
2月前
|
Rust 安全 Java
Java Stream 使用指南
本文介绍了Java中Stream流的使用方法,包括如何创建Stream流、中间操作(如map、filter、sorted等)和终结操作(如collect、forEach等)。此外,还讲解了并行流的概念及其可能带来的线程安全问题,并给出了示例代码。
|
4月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
62 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
4月前
|
Java Shell 流计算
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
37 1
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
|
3月前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
39 0
|
3月前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
5月前
|
存储 Java API
Java——Stream流详解
Stream流是JDK 8引入的概念,用于高效处理集合或数组数据。其API支持声明式编程,操作分为中间操作和终端操作。中间操作包括过滤、映射、排序等,可链式调用;终端操作则完成数据处理,如遍历、收集等。Stream流简化了集合与数组的操作,提升了代码的简洁性
240 11
|
5月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】