RxJava学习笔记

之前有过一次学习笔记,发现长时间不经常用Rx的一些操作已经忘得差不多了,经常的复习是多么的重要啊,这次会在上一次不足的部分补充一下。
上一次的学习笔记:http://wiki.sankuai.com/pages/viewpage.action?pageId=405485429

Rx操作符补充

flatMap 使用

flatMap时将原本发送的数据进行转换,再返回转换后数据的Observable,flatMap会合并这些Observable,再作为自己的数据源发射。

    Observable.just(2)
            .flatMap(new Func1<Integer, Observable<String>>() {
                @Override
                public Observable<String> call(Integer integer) {
                    return Observable.just(""+(integer+ 2));
                }
            })
            .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    Log.e("flatMap",s);
                }
            });

flatMapIterable使用

flatMapIterable本质上也是flatMap区别是 flatMapIterable会把每一个数据转换成一个Iterable ,然后Iterable作为数据源 ,再发射。

    Observable.just(1,2,3,4)
            .flatMapIterable(new Func1<Integer, Iterable<Integer>>() {
                @Override
                public Iterable<Integer> call(Integer integer) {
                    ArrayList<Integer> array = new ArrayList<Integer>();
                    for(int i = 0; i<integer ;i++){
                        array.add(i);
                    }
                    return array;
                }
            })
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.e("flatMapIterable", ""+integer);
                }
            });

Result:
0, 0, 1, 0, 1, 2, 0, 1, 2, 3

讲一点 flatMap 和 map需要注意的地方,当使用flatMap的时候,当return为null的时候,将不会接收到null的数据,想要接收到null则需要发射Observable.just(null),对于map当返回了null,将会接收到null。

buffer使用

buffer会将按照指定的条件发射的数据转换成缓存成list 再发射。buffer(int count, int skip)表示缓存cunnt数字,越过skip - count的数量,也可以根据时间来缓存buffer(long timespan, TimeUnit unit)

    Observable.just(1,2,3,4,5,6,7,8,9)
            .buffer(2,5)
            .subscribe(new Action1<List<Integer>>() {
                @Override
                public void call(List<Integer> integers) {
                    Log.e("buffer",""+integers.size());
                    for(Integer in:integers){
                        Log.e("s"," " + in);
                    }
                }
            });

输出结果: E/buffer: 2 E/s: 1 E/s: 2 E/buffer: 2 E/s: 6 E/s: 7

ofType(一种特殊的filter)

    Observable.just(1,"s")
            .ofType(Integer.class)
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.e("oftype","" + integer);
                }
            });

可以过滤掉非指定类型的数据。

区分first 与 takeFirst 与single

first 与 takeFirst都是取 发射的第一个。不同的是,当数据没有发射而直接completed的时候 first将会抛出error,但是takeFirst将直接到onCompleted,single是获取发射元素的唯一的一个 如果发射的队列中满足条件的元素不唯一或者没有发射都将抛出error。

IgnoreElements

IgnoreElements是忽略所有发射的元素,只会收到onError 和 onComplete。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容