• JAVA Steam原理和常见操作


    1.Stream原理

    Stream是JAVA8开始的新的用法。Stream本意为流,Stream也确实如流一样,给操作带来了方便。

    Stream的表现是:

    1)提供一个特定类型的队列;

    2)提供一系列操作,让队列拥有类似于SQL语句的操作。

    Stream的原理或背后的基本支持是ForkJoinPool。ForkJoinPool主要用来使用分治法(Divide-and-Conquer Algorithm) 来解决问题,即把多个大任务分割为多个小型子任务。

    但该任务的缺点是:如果子任务没有完成,整个总任务也没法进行完成和归并。

    ForkJoinPool的解决方式是:

    1)提供双向队列;

    2)空的任务从别的队列的队尾中取数据,从而让任务均分和不空闲,也让整体任务进行得更快。

    值得注意的是,ForkJoinPool提供了线程池,每个任务一个线程,并试图让不同线程绑定不同CPU,从而让整个任务更加高效。

    新的Stream,也支持Lamba函数(匿名函数),从而让整个过程和类型无关。

    2.常见操作

    Stream的常见操作分为如下几类:

    无状态:指元素的处理不受之前元素的影响;
    有状态:指该操作只有拿到所有元素之后才能继续下去。
    非短路操作:指必须处理所有元素才能得到最终结果; 
    短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。

    可以进行的SQL语句如Select a, b from C where C.d = 2可以用如下语句实现:

    list

            .stream

            .filter(e -> e.d == 2)

            .map(e -> {

                    Class AB  = new Class();

                    AB.a = e.a;

                    AB.b = e.b;

                    return AB;

                    })

            .collect(Collectors.toList());

    3.总结

    Stream带来了便利,但依然不能完全替代SQL;比如,不能做到两个表的类似SQL的Join操作。必须自己写程序实现。

    Stream其实提供了一系列操作方便的接口(API);如果想用,直接用即可,不用关心底层实现。这个结论,让笔者想起一个工程师前辈跟我说过的话:算法和数据结构的关系是什么,算法的具体实现,是依赖于数据结构的;但算法其实是提供一个通用的方法,让使用者不关心具体的数据结构和实现方式。

    而计算机的性能越来越高,提供通用的方式,才是工程师最应该关心的事情。

  • 相关阅读:
    android studio SQLite数据库的简单使用
    electron学习笔记
    Matlab论文插图绘制模板第44期—二元直方图(Histogram2)
    如何实现MongoDB数据的快速迁移?
    ETCD数据库源码分析——Cluster membership changes日志
    如何在lnmp中实现PHP多版本共存
    Learned Index on GPU(ICDE2022)
    flutter 使用getx 框架系统日历 showDatePicker && selectTimeWidget 多语言切换终极解决方案
    someip 入门
    深度解读面试题:链表中环的入口结点(附代码,可过在线OJ)
  • 原文地址:https://blog.csdn.net/wangzhezhilu001/article/details/125405613