一篇RxJava友好的文章(二)

作者: 方志朋 | 来源:发表于2016-10-30 18:32 被阅读1328次

    上一篇文章介绍了rxjava的基本用法,和一些常用的操作符,以及rxjava的链式操作带来的好处。由于rxjava非常的强大,让我如此的痴迷,我打算写五篇文章,专门讲解rxjava 常见的操作符和用法,敬请期待。这篇文章主要讲解过滤操作符。

    1.distinct操作符

    过滤掉重复的数据项,只让还没有发送过数据项通过。

    Paste_Image.png
      
     rx.Observable.just("1","2","2","3","4")
       .distinct(new Func1<String, String>() {
                @Override
                public String call(String s) {
                    return "key"+s;//这时候比较的是key+s  而不是比较s
                }
            })
        .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    Log.e(TAG,s);
                }
            });
        }
    

    运行程序,输出结果 :

    1

    2

    3

    4

    它的作用是去掉相同的元素,例如例子中去掉了2

    2.ElementAt

    只发射第n项数据

    Paste_Image.png
       rx.Observable.just("1","2","3")
       .elementAt(1)
       .subscribe(new Action1<String>() {//只发射第二个元素
                @Override
                public void call(String s) {
                    Log.e(TAG,s);
                }
            });
    
            rx.Observable.just("1","2","3")
            .elementAtOrDefault(11,"11111")
            .subscribe(new Action1<String>() {//只发射第二个元素
                @Override
                public void call(String s) {
                    Log.e(TAG,s);
                }
            });       
                                
    

    运行结果:

    2

    11111

    elemntAt(1)发射第二项数据;elementAtOrDefault(11,"11111"),由于observable没有11找个索引元素,所以发送了默认的11111

    3.first操作符

    只发射第一项数据或者满足条件的第一项数据,如果你需要第一项数据,或者满足条件的第一项数据,可以使用该操作符

    Paste_Image.png
    rx.Observable.just("1","2","3")
      .first()
      .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    Log.e(TAG,s);
                }
            });
    
    rx.Observable.just(1,2,3)
       .first(new Func1<Integer, Boolean>() {
              @Override
            public Boolean call(Integer integer) {
               if(integer>2) return true;
                  return false;
              }
            })
        .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                 Log.e(TAG,integer+"");
              }
          }); 
    

    运行结果:

    1

    3

    4.last 操作符

    last只发射最后一项数据,和first 正好相反。

    rx.Observable.just(1,2,3,4)
    .last().subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.e(TAG,integer+"");
                }
            });
    

    允许结果:

    4

    5.sample操作符

    定期采样并发射 observable 最近的数据

    Paste_Image.png
    rx.Observable.interval(300, TimeUnit.MILLISECONDS)
       .sample(2,TimeUnit.SECONDS)
       .subscribe(new Action1<Long>() {
                @Override
                public void call(Long aLong) {
                    Log.e(TAG,aLong+"");
                }
            });
    
    

    运行结果:

    6

    13

    ....

    observal 每300ms发射一个从0到n的数据,sample 每隔2s取一个observal 最近发射的数据,并发射出去。

    6.skip操作符

    跳过前n项数据,也就说不发射前n项数据。

    Paste_Image.png
    rx.Observable.just(1,2,4,5,6)
        .skip(2)
        .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.e(TAG,integer+"");
                }
            });
    
    

    运行结果:

    4

    5

    6

    前面2项数据跳过不发射。

    所有的过滤操作符:

    Paste_Image.png

    好了,今天的讲解了过滤操作符,写了这篇文章相信你很快就会理解。
    过滤操作符不止这些,另外还有很多其他的过滤操作符,需要你们自己一个一个的摸索了。感谢大家,如果觉得可以点个赞吧,哈哈……_
    欢迎关注我的开源项目:瓣呀,一个基于豆瓣API仿网易云音乐的开源项目
    项目地址:https://github.com/forezp/banya

    关注我:

    image

    相关文章

      网友评论

        本文标题:一篇RxJava友好的文章(二)

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