“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。



本作品由 Tony Zhang 创作,采用 CC BY-NC-SA 3.0 许可协议 进行许可。

Comments