操作符
操作符是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。
RxJava提供了很多很有用的操作符。
Subscribers更应该做的事情是“响应”,响应Observable发出的事件,而不是去修改。
所以修改就交给操作符吧.
Map
transform the items emitted by an Observable by applying a function to each item
用来把一个事件转换为另一个事件。
map()操作符就是用于变换Observable对象的,map操作符返回一个Observable对象,这样就可以实现链式调用,在一个Observable对象上多次使用map操作符,最终将最简洁的数据传递给Subscriber对象。
特性:
- 它不必返回Observable对象返回的类型,你可以使用map操作符返回一个发出新的数据类型的observable对象。
- 可以对一个Observable多次使用map
用一个例子来练习:
//刚创建的Observable是String类型的
Observable.just("Hellp Map Operator")
.map(new Func1() {
@Override
public Integer call(String s) {
return 2015;//通过第一个map转成Integer
}
}).map(new Func1() {
@Override
public String call(Integer integer) {
return String.valueOf(integer);//再通过第二个map转成String
}
}).subscribe(new Action1() {
@Override
public void call(String s) {
System.out.println(s);
}
});
Run起来输出日志:
2015
From
convert various other objects and data types into Observables
from()
接收一个集合作为输入,然后每次输出一个元素给subscriber.
- from(Iterable extends T> iterable)
- from(T[] array)
看个例子,将集合的数据都输出:
List s = Arrays.asList("Java", "Android", "Ruby", "Ios", "Swift");
Observable.from(s).subscribe(new Action1() {
@Override
public void call(String s) {
System.out.println(s);
}
});
Log:
Java
Android
Ruby
Ios
Swift
另外from
也接受数组类型:
Observable.from(new String[]{"Java","Android"}).subscribe(new Action1() {
@Override
public void call(String s) {
System.out.println(s);
}
});
FlatMap
transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable
Observable.flatMap()接收一个Observable的输出作为输入,同时输出另外一个Observable。
先加一个函数
static Observable>query(){
List s = Arrays.asList("Java", "Android", "Ruby", "Ios", "Swift");
return Observable.just(s);
}
我们打印所有query到的语言:
// 注意这里的参数是 query所返回的Observable的输出,并且返会一个Observable
query().flatMap(new Func1, Observable>() {
@Override
public Observable call(List strings) {
//结合from处理
return Observable.from(strings);
}
}).subscribe(new Action1() {
@Override
public void call(String s) {
System.out.println("_flatMap:"+s);
}
});
日志:
_flatMap:Java
_flatMap:Android
_flatMap:Ruby
_flatMap:Ios
_flatMap:Swift
注意:query返回的Observable的输出是List,在flatMap中变成了参数,而处理过后,返回一个Observable.
假设这时候我们需要处理一下所获取的结果,我们加个前缀,在保证不修改subscribe的前提下我们可以这么做:
增加个函数,用来增加个前缀:
static ObservableaddPre(String lan){
return Observable.just("addPre_"+lan);
}
代码可以这么写:
query().flatMap(new Func1, Observable>() {
@Override
public Observable call(List strings) {
return Observable.from(strings);
}
}).flatMap(new Func1>() {
@Override
public Observable call(String s) {
//我们在这里调用`addPre`方法,就行处理
return addPre(s);
}
}).subscribe(new Action1() {
@Override
public void call(String s) {
System.out.println(s);
}
});
输出日志
addPre_Java
addPre_Android
addPre_Ruby
addPre_Ios
addPre_Swift
map与flatMap的区别(出自朱凯):
map 是在一个 item 被发射之后,到达 map 处经过转换变成另一个 item ,然后继续往下走;
flapMap 是 item 被发射之后,到达 flatMap 处经过转换变成一个 Observable ,而这个 Observable 并不会直接被发射出去,而是会立即被激活,然后把它发射出的每个 item 都传入流中,再继续走下去。
所以 flatMap 和 map 有两个区别:
- 经过 Observable 的转换,相当于重新开了一个异步的流;
- item 被分散了,个数发生了变化。
这个flatMap还是比较难以理解,它到底是如何工作的.
自己还需要多去了解一下.
更多操作符
- filter 过滤,把不符合条件的过滤掉,留下符合条件的
- take 指定最多输出的数量
- doOnNext 允许我们在每次输出一个元素之前做一些额外的事情(其实就是在
onNext
里调用的)
就用一个例子来演示一下吧:
query().flatMap(new Func1, Observable>() {
@Override
public Observable call(List strings) {
return Observable.from(strings);
}
}).flatMap(new Func1>() {
@Override
public Observable call(String s) {
return addPre(s);
}
}).filter(new Func1() {
@Override
public Boolean call(String s) {
//包含a的留下
return s.contains("a");
}
}).take(3)//最多只取3个
.doOnNext(new Action1() {
@Override
public void call(String s) {
//onNext之前 输出一下
System.out.println("doOnNext:"+s);
}
}).subscribe(new Action1() {
@Override
public void call(String s) {
System.out.println(s);
}
});
输出:
doOnNext:addPre_Java
addPre_Java
doOnNext:addPre_Android
addPre_Android
doOnNext:addPre_Ruby
addPre_Ruby
还有很多很多很多操作符需要去学习,这里就列举这么几个.
参考
深入浅出RxJava(二:操作符)
Operators
安利:
我的Github
我的微博
我的微信公众号: