简谈jdk8-stream

目录

 

动机

概念

流程


动机

   最近想了解下stream的原理,于是做此记录。

概念

    先说说stream API用来干啥的吧,设计API总有个目的吧,以我来看就是简化下代码,比如有个这样的需求:从List把所有元素*2,最后将每个元素输出,我们可能要写如下代码。

List<Integer> list = Arrays.asList(1,2,3,4,5);
for(Integer i :list){
   System.out.println(i*2);
}

那stream API怎么写呢?

List<Integer> list = Arrays.asList(1,2,3,4,5);
list.stream().map(t->{return t*2;}).forEach(System.out::println);

没看出有多大方便之处啊,那现在我们变下需求,在*2之后,加上不要=2的。那就有如下差异。

List<Integer> list = Arrays.asList(1,2,3,4,5);
for(Integer i :list){
   if(i != 2 )
     System.out.println(i*2);
}

list.stream().map(t->{return t*2;}).filter((t)->{return t!=2;}).forEach(System.out::println);

其实在我看来,stream就是简化了代码,是代码看起来简单易懂,当然stream还有并行的处理方式,这里先不做探讨。

流程

    了解了大概概念后,想知道如何执行,或者说stream模型是啥样的,先看个简单图片。

其实stream模型大致如此,每个一个个stage形成链表,而每个stage封装了数据源和回调方法,这样逐个stage执行回调一起执行。下面看下代码,比如1个map().

public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) {
        Objects.requireNonNull(mapper);
        return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE,
                                     StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
            @Override
            Sink<P_OUT> opWrapSink(int flags, Sink<R> sink) {
                return new Sink.ChainedReference<P_OUT, R>(sink) {
                    @Override
                    public void accept(P_OUT u) {
                        downstream.accept(mapper.apply(u));
                    }
                };
            }
        };
    }

map()会返回个StateLessOp(AbstractPipeline)即1个stage,并且重写了opWrapSink方法,flags为操作标记,sink是接收返回结果的,即sink是ChainedReference,mapper即回调。这样我们代码一旦调用sink的accept方法,那就会先执行回调,然会调用下一个sink的accept,即每个stage执行先触发自己的回调,然后再调用下个stage的accept。这里没说sink的模型,sink其实是个单向链表。

static abstract class ChainedReference<T, E_OUT> implements Sink<T> {
        protected final Sink<? super E_OUT> downstream;

        public ChainedReference(Sink<? super E_OUT> downstream) {
            this.downstream = Objects.requireNonNull(downstream);
        }
}

总结

    模型组件,AbstractPipeline阶段、Sink操作回调封装、Spliterator加强版Iterator。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

&一步

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

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

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

打赏作者

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

抵扣说明:

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

余额充值