Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1537210
  • 博文数量: 113
  • 博客积分: 3526
  • 博客等级: 中校
  • 技术积分: 1815
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-08 09:46
个人简介

记录总结自己的工作

文章分类

全部博文(113)

文章存档

2015年(19)

2014年(10)

2013年(6)

2012年(16)

2011年(24)

2010年(21)

2009年(17)

分类: Android平台

2015-09-30 14:50:53

    在这篇文章里我们来了解一下Rxjava的聚合操作符。

    一、Concat
    Concat操作符将多个Observable结合成一个Observable并发射数据,并且严格按照先后顺序发射数据,前一个Observable的数据没有发射完,是不能发射后面Observable的数据的。
    有两个操作符跟它类似,但是有区别,分别是
    1.startWith:仅仅是在前面插上一个数据。
    2.merge:其发射的数据是无序的。

    二、Count
    Count操作符用来统计源Observable发射了多少个数据,最后将数目给发射出来;如果源Observable发射错误,则会将错误直接报出来;在源Observable没有终止前,count是不会发射统计数据的。

    下面使用Concat和Count操作符来结合多个Observable和统计发射数据的数目

点击(此处)折叠或打开

  1. private Observable<Integer> concatObserver() {
  2.         Observable<Integer> obser1 = Observable.just(1, 2, 3);
  3.         Observable<Integer> obser2 = Observable.just(4, 5, 6);
  4.         Observable<Integer> obser3 = Observable.just(7, 8, 9);
  5.         return Observable.concat(obser1, obser2, obser3);
  6.     }
  7.     private Observable<Integer> conuntObserver() {
  8.         return Observable.just(1, 2, 3).count();
  9.     }
    分别进行订阅

点击(此处)折叠或打开

  1. mLButton.setText("concat");
  2. mLButton.setOnClickListener(e -> concatObserver().subscribe(i -> log("concat:" + i)));
  3. mRButton.setText("conunt");
  4. mRButton.setOnClickListener(e -> conuntObserver().subscribe(i -> log("conunt:" + i)));
    运行结果如下


    三、Reduce、Collect
    Reduce操作符应用一个函数接收Observable发射的数据和函数的计算结果作为下次计算的参数,输出最后的结果。跟前面我们了解过的scan操作符很类似,只是scan会输出每次计算的结果,而reduce只会输出最后的结果。
    Collect操作符类似于Reduce,但是其目的不同,collect用来将源Observable发射的数据给收集到一个数据结构里面,需要使用两个参数:
    1.一个产生收集数据结构的函数。
    2.一个接收第一个函数产生的数据结构和源Observable发射的数据作为参数的函数。

   
    下面我们来使用一下reduce和collect操作符。同当初scan的例子一样,我们使用一个装了10个数字2的list创建源Observable。

点击(此处)折叠或打开

  1. private Observable<Integer> reduceObserver() {
  2.         return Observable.from(list).reduce((x, y) -> x * y);
  3.     }
  4.     private Observable<ArrayList<Integer>> collectObserver() {
  5.          return Observable.from(list).collect(() -> new ArrayList<>(), (integers, integer) -> integers.add(integer));
  6.     }
    分别进行订阅

点击(此处)折叠或打开

  1. mLButton.setText("reduce");
  2. mLButton.setOnClickListener(e -> reduceObserver().subscribe(i -> log("reduce:" + i)));
  3. mRButton.setText("collect");
  4. mRButton.setOnClickListener(e -> collectObserver().subscribe(i -> log("collect:" + i)));
    运行结果如下


    聚合操作符比较少,就到这里了,本文中的源代码见

阅读(6987) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~