@IT·互联网程序员首页投稿(暂停使用,暂停投稿)

一篇RxJava友好的文章(二)

2016-10-30  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读