第二篇 RxJava常用操作符
接着上一篇文章,本文开始介绍一些常用的操作符,如果你想了解更多相关操作符,可以自行去gitbug上的地址查阅文档RxJavaDoc。如果你还没有看过上一篇文章可以先去随便翻翻。第一篇 在Android中使用RxJava
1. Observable.fromArray(T ... item)
还记得上一篇文章中的just么,这里它和just有着相同的功能,都是接受数据源并创建一个被观察者对象。不同的是fromArray可以接受可变长参数对象(其实就是一个数组),它会把数组中的每个元素发射出来。just也是可以输入多个参数,但是是定长的,SDK内置了一些重载的方法,最多可以输入10个参数。自己去看看源码就明白了。
String[] strs={"I","am","a","person"};
Observable.fromArray(strs).subscribe(str->Log.i(str));
2. Observable.fromIterable(Iterable<? extends T> source)
此方法接收一个继承自Iterable接口的参数,简单的说就是java中的集合类。因此你可以传入一个list集合等等
List<String> list=new ArrayList<>();
list.add("I");
list.add("am");
list.add("a");
list.add("person!");
Observable.fromIterable(list)
.subscribe(str->Log.i(str));
3. Observable.interval(long initialDelay, long period, TimeUnit unit)
此方法返回一个每隔指定的时间间隔就发射一个序号的 Observable 对象,可用来做倒计时心跳包等操作,无限发送,除非调用dispose()可以终止。
//开始不延时,之后每隔一秒发送一次序列号从 0 开始,每次累加 1如0 1 2 3 4 5.....
Observable.interval(0,1, TimeUnit.SECONDS)
.subscribe(num->Log.i(num+""));
4. Observable.timer(long delay, TimeUnit unit)
创建一个在指定延迟时间后发射一条数据( 固定值:0 )的 Observable 对象,可用来做定时操作。
//3秒后会输出0
Observable.timer(3,TimeUnit.SECONDS)
.subscribe(num->Log.i(num+""));
5. Observable.range(final int start, final int count)
此方法可以发射一个指定范围的数
//会直接输出2 3 4 5 6
Observable.range(2,5).subscribe(num->{Log.i(num+"");});
6. map
map 操作符是可以将返回的数据变换成别的数据类新,比如你可以使用 map 操作符将原来要发射的字符串数据变换成数值型在发射出去。
List<String> list=new ArrayList<>();
list.add("I");
list.add("am");
list.add("a");
list.add("person");
//这里使用map将重新生成一个Integer类型的Observabl最终打印出来的是每个字符串的hashCode值
Observable.fromIterable(list)
.map(str->str.hashCode())
.subscribe(num->Log.i(num+""));
7. flatMap
不同于map的是flatMap 返回的是一个全新的Observable 对象。这里使用网上的一个例子,将原本List<Integer>的被观察者数据类型转换成了Integer的被观察者数据类型。这里Flowable和Observable本质是一个东西,Flowable是Rx2.0里的东西为了解决一种叫做背压的问题而诞生的,想要知道什么是背压?请移步至backpressure概念理解
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(1);
list.add(5);
Flowable.just(list)
.flatMap(new Function<List<Integer>, Publisher<Integer>>() {
@Override
public Publisher<Integer> apply(List<Integer> integers) throws Exception {
return Flowable.fromIterable(integers);
}
}) .subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println(integer);
}
});
8. filter
这个操作符可以作为数据筛选器,帮你过滤不想要的数据。
下面的例子当数据>3才能放过,因此输出4 5
Observable.fromArray(1,2,-3,4,5)
.filter(integer -> integer>3)
.subscribe(integer -> Log.i(integer+""));
9. take
此操作符用于指定想要的数据数量,下面的例子最终只输出1和2
Observable.fromArray(1,2,-3,4,5)
.take(2)
.subscribe(integer -> Log.i(integer+""));
10. doOnNext
此操作符可以在消费者也就是观察者 接收到数据之前做事。
操作符还有很多很多暂时先说到这,等不及的可以先去看看官方文档。后面在补充