美文网首页
java-stream(二)

java-stream(二)

作者: go_2021 | 来源:发表于2022-01-07 22:55 被阅读0次
源码是如何实现的

我们随便其中一个方法,比如filter,然后在ReferencePipeline类中找到方法的实现:

@Override
    public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate) {
        Objects.requireNonNull(predicate);
        return new StatelessOp<P_OUT, P_OUT>(this, StreamShape.REFERENCE,
                                     StreamOpFlag.NOT_SIZED) {
            @Override
            Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) {
                return new Sink.ChainedReference<P_OUT, P_OUT>(sink) {
                    @Override
                    public void begin(long size) {
                        downstream.begin(-1);
                    }

                    @Override
                    public void accept(P_OUT u) {
                        if (predicate.test(u))
                            downstream.accept(u);
                    }
                };
            }
        };
    }

返回Stream这是链式操作的关键,大致分为2层StateLessOp可以看为一个ReferencePipeline,OpWrapSink可以理解为一个sink。
ReferencePipeline有一些StreamOpFlag和StreamShape的属性,还有StatelessOp特性。
sink理解为水槽,水槽里有我们要执行的操作,分为begin,accept,end方法,accept里放的就是我们实现的业务逻辑。
继续一层层跟进我们到了AbstractPipiline的构造方法:


这里把ReferencePipeline形成了一个双向链表:


如何运行的

在运行时打断点发现,关键代码在AbstractPipeline的copyInto方法。




分析可得,假如我们的流是stream.limit(2).filter().map().count()
中间操作的执行流程就是
limit->begin()->filter->begin()->map->begin()
for(list中的元素1,2,3){
1limit->accept()->filter->accept()->map->accept()
2limit->accept()->filter->accept()->map->accept()
3limit->accept()没有通过}
limit->end()->filter->end()->map->end()
这就是操作组合后的执行过程也是实现流只需一次循环。

如何判断短路操作的

如图中的combinedFlags成员变量,会根据前后的OpFlags来判断是否是短路操作。



又是上面的一张图,此时会走else逻辑:



forEachWithCancel就是短路操作的关键。

一些技巧

  • 强转类型
arrayList.stream().map(x -> (JSONObject) x).filter(x -> {
           //本来就是JSONObject类型却不能在filter中强转获取,可以加一层强转map
        }).findAny().get();

相关文章

  • java-stream(二)

    源码是如何实现的 我们随便其中一个方法,比如filter,然后在ReferencePipeline类中找到方法的实...

  • java-stream

    Stream(流):以一种声明的方式处理数据。 是一个来自数据源的元素队列并支持聚合操作,比如filter, ma...

  • java-stream(下)

    转载文章 上一篇文章我讲解 Stream 流的基本原理,以及它的基本方法使用,本篇文章我们继续讲解流的其他操作没有...

  • java-stream(上)

    转载文章 Java 8 发布至今也已经好几年过去,如今 Java 也已经向 11 迈去,但是 Java 8 作出的...

  • java-stream(一)

    吾尝终日而思矣,不如须臾之所学以。 这个流是干啥的? 流可以简单理解为,把我们业务中数据过滤,分页,求和,分类汇总...

  • Java-Stream实现生成质数的无限流

    思路:使用Strream.generate方法 代码实现IntSupplier,而不是用Lambda表达式,是为了...

  • 二(二)

    发什么神经 突然就很想花钱 一边心疼 一边毫不在乎的花 啧 莫名其妙

  • 二,二

    2017.9.11教师节后的周一,第一次走进教室,刚站到讲台两个小可爱送给我两束花,原谅我那时候人还没有认全没有记...

  • 二〇二〇

    本来这篇小结打算年初写的,但是想想后边还有复试就先放一放,结果复试结束后过了两个月才想起要写这篇小结... 时过境...

  • 二金二木二火二土

    今天看完了极简中国史,这本书看了半个多月,因为是八十年前写的书,不是白话文,所以看的特别累。不过从近代前辈的角度去...

网友评论

      本文标题:java-stream(二)

      本文链接:https://www.haomeiwen.com/subject/xppqcrtx.html