还是上面的例子,我们想在输出“John”的后面加一个字符串后缀“后缀”,我们很容易想到在Observable中修改输出的字符串
Observable.just("John"+"后缀").subscribe(new Action1<String>() {
@Override
public void call(String s) {
textView.setText(s);
}
});
但是你能改变Observable对象,那当然是可以的,但是如果不能修改Observable对象,例如Observable对象是第三方库提供的,或者Observable对象被多个Subscriber对象订阅,但是我们只想对某个订阅者进行修改。
那是否可以对Subscriber中进行修改呢?例如
Observable.just("John").subscribe(new Action1<String>() {
@Override
public void call(String s) {
textView.setText(s+"后缀");
}
});
但是这种方式不是很能让人满意,因为我们希望Subscribers越轻越好,因为有可能在mainThread中运行subscriber(这句话还不是很理解)。另外根据响应式的函数编程的概念,Subscribers更加应该做的事情是“响应”,响应Observable发出的事件,而不是去修改。如果能在某些中间步骤对“John”进行变换,那岂不是很有趣。
操作符
操作符就是用来解决对Observable对象变换的问题,操作符用于修改在Obervable和最终的Subscriber之间修改Observable发出的事件。RxJava提供了很多很有用的操作符。
现在就来将map操作符,使用来把一个事件转化为另一个事件的。
Observable.just("John").map(new Func1<String, String>() {
@Override
public String call(String s) {
return s+"后缀";
}
}) .subscribe(new Action1<String>() {
@Override
public void call(String s) {
textView.setText(s);
}
});
map()操作符就是用于变换Observable对象的,map操作符返回的是Observable对象,这样就实现链式调用,在一个Observable对象上多次运用map操作符,最终将简洁的数据传送给Subscriber对象。
map操作符进阶
map操作符更有趣的一点是它不必返回Observable对象返回的类型,你可以使用map操作符返回一个发出新的数据类型的observable对象。
比如上面的例子中,subscriber并不关心返回的字符串,而是想要字符串的hash值。
Observable.just("John").map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.hashCode();
}
}) .subscribe(new Action1<Integer>() {
@Override
public void call(Integer i) {
textView.setText(Integer.toString(i));
}
});
可以得出字符串的hash值。
前面说过Subscriber所做的事情越少越好,我们再增加一个map操作符,如
Observable.just("John").map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.hashCode();
}
}).map(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
return Integer.toString(integer);
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
textView.setText(s);
}
});
现在我们只需要知道两点:
1.Observable和Subscriber可以做任何事情
Observable可以进行数据查询,Subscriber用来显示结果;Observable是屏幕上的点击事件,Subscriber用来响应事件;Observable可以是网络请求,Subscriber用来显示请求结果。
2.Observable和Subscriber是独立于中间变换过程的
在Observable和Subscriber中间可以增减任何数量的map。整个系统是高度整合的,操作数据是一个很简单的过程。
声明:本文的内容来自博客:http://blog.csdn.net/lzyzsd/article/details/41833541