RxJava的map操作符

2 篇文章 0 订阅

还是上面的例子,我们想在输出“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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值