Rxjava的学习之变换操作符—scan

一、scan(Func2))

      连续地对数据序列的每一项应用一个函数,然后连续发射结果

这里写图片描述

      Scan操作符对原始Observable发射的第一项数据应用一个函数,然后将那个函数的结果作为自己的第一项数据发射。它将函数的结果同第二项数据一起填充给这个函数来产生它自己的第二项数据。它持续进行这个过程来产生剩余的数据序列。这个操作符在某些情况下被叫做accumulator。

这里写图片描述

 Observable.just(1,2,3,4,5)
        .scan(new Func2<Integer, Integer, Integer>() {
          @Override public Integer call(Integer sum, Integer item) {
            return sum+item;
          }
        })
        .subscribe(new Action1<Integer>() {
          @Override public void call(Integer item) {
            Log.d("TAG","scan:"+item);
          }
        });


    使用lambda表达式简化:
   Observable.just(1,2,3,4,5)
        .scan((sum, item) -> sum+item)
        .subscribe(item -> Log.d("TAG","scan:"+item));

运行结果:
scan: 1
scan: 3
scan: 6
scan: 10
scan: 15

二、 scan(R,Func2))

R参数的意思是将其当做一个基值,让后续的值去累加计算。
      有一个scan操作符的变体,你可以传递一个种子值给累加器函数的第一次调用(Observable发射的第一项数据)。如果你使用这个版本,scan将发射种子值作为自己的第一项数据。注意:传递null作为种子值与不传递是不同的,null种子值是合法的。
      这个操作符默认不在任何特定的调度器上执行。

这里写图片描述

  Observable.just(1,2,3,4,5)
        .scan(10,new Func2<Integer, Integer, Integer>() {
          @Override public Integer call(Integer sum, Integer item) {
            return sum+item;
          }
        })
        .subscribe(new Action1<Integer>() {
          @Override public void call(Integer item) {
            Log.d("TAG","scan:"+item);
          }
        });


 使用lambda表达式简化:
 Observable.just(1,2,3,4,5)
        .scan(10, (sum, item) -> sum+item)
        .subscribe(item -> Log.d("TAG","scan:"+item));

运行结果:
scan: 11
scan: 13
scan: 16
scan: 20
scan: 25

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值