Rxjava(2)

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

1.distinct操作符

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

Paste_Image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  
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](http://upload-images.jianshu.io/upload_images/2279594-b85704b90b77d603.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


rx.Observable.just(“1”,”2”,”3”)
.elementAt(1)
.subscribe(new Action1() {//只发射第二个元素
@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);
        }
    });       
                        
1
2
3
4
5
6
7
8
9
10
11
12
13
14

*运行结果:*
> 2
>
> 11111

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

### 3.first操作符

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

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2279594-595749c0400c2c06.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

rx.Observable.just(“1”,”2”,”3”)
.first()
.subscribe(new Action1() {
@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() {
@Override
public void call(Integer integer) {
Log.e(TAG,integer+””);
}
});

1
2
3
4
5
6
7
8
9
10
11

*运行结果:*
> 1
>
> 3


### 4.last 操作符

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

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

1
2
3
4
5
6
7
8
9
10
11

允许结果:
>4


### 5.sample操作符

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

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2279594-45bd255cbbe2e731.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

*运行结果:*
> 6
>
> 13
>
> ....

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

### 6.skip操作符
跳过前n项数据,也就说不发射前n项数据。

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2279594-44976b1de9c347f5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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


*运行结果:*
>4
>
>5
>
>6

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



所有的过滤操作符:

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2279594-08fb0157814ac222.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

好了,今天的讲解了过滤操作符,写了这篇文章相信你很快就会理解。
过滤操作符不止这些,另外还有很多其他的过滤操作符,需要你们自己一个一个的摸索了。感谢大家,如果觉得可以点个赞吧,哈哈……^_^
请我吃🍗