Rxjava操作符

 总览

1. 创建型操作符:

        即创建被观察者对象,并发送事件。

1.1  create()

        最基本的创建被观察者的方法(上一篇代码示例中有用)。

        Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> observableEmitter) throws Exception {
                observableEmitter.onNext("emit A");
                observableEmitter.onNext("emit B");
                observableEmitter.onNext("emit C");
                observableEmitter.onComplete();
            }
        });

   

1.2  just() 

        将传入的数据一次发射出去(最多10个)  

public class Test {

    private static void test(){

        Observable<String> observable = Observable.just("1","2","3","4","5","6","7","8","9","10");

        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                System.out.println(s);
            }
        };
        observable.subscribe(consumer);
    }

    public static void main(String[] args) {
        test();
    }
}

运行结果:

        之所以是最多10个,看他的源码就能发现:因为他的构造函数最多支持10个参数

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item) {
        ObjectHelper.requireNonNull(item, "The item is null");
        return RxJavaPlugins.onAssembly(new ObservableJust(item));
    }

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item1, T item2) {
        ObjectHelper.requireNonNull(item1, "The first item is null");
        ObjectHelper.requireNonNull(item2, "The second item is null");
        return fromArray(item1, item2);
    }

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item1, T item2, T item3) {
        ObjectHelper.requireNonNull(item1, "The first item is null");
        ObjectHelper.requireNonNull(item2, "The second item is null");
        ObjectHelper.requireNonNull(item3, "The third item is null");
        return fromArray(item1, item2, item3);
    }

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item1, T item2, T item3, T item4) {
        ObjectHelper.requireNonNull(item1, "The first item is null");
        ObjectHelper.requireNonNull(item2, "The second item is null");
        ObjectHelper.requireNonNull(item3, "The third item is null");
        ObjectHelper.requireNonNull(item4, "The fourth item is null");
        return fromArray(item1, item2, item3, item4);
    }

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item1, T item2, T item3, T item4, T item5) {
        ObjectHelper.requireNonNull(item1, "The first item is null");
        ObjectHelper.requireNonNull(item2, "The second item is null");
        ObjectHelper.requireNonNull(item3, "The third item is null");
        ObjectHelper.requireNonNull(item4, "The fourth item is null");
        ObjectHelper.requireNonNull(item5, "The fifth item is null");
        return fromArray(item1, item2, item3, item4, item5);
    }

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item1, T item2, T item3, T item4, T item5, T item6) {
        ObjectHelper.requireNonNull(item1, "The first item is null");
        ObjectHelper.requireNonNull(item2, "The second item is null");
        ObjectHelper.requireNonNull(item3, "The third item is null");
        ObjectHelper.requireNonNull(item4, "The fourth item is null");
        ObjectHelper.requireNonNull(item5, "The fifth item is null");
        ObjectHelper.requireNonNull(item6, "The sixth item is null");
        return fromArray(item1, item2, item3, item4, item5, item6);
    }

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item1, T item2, T item3, T item4, T item5, T item6, T item7) {
        ObjectHelper.requireNonNull(item1, "The first item is null");
        ObjectHelper.requireNonNull(item2, "The second item is null");
        ObjectHelper.requireNonNull(item3, "The third item is null");
        ObjectHelper.requireNonNull(item4, "The fourth item is null");
        ObjectHelper.requireNonNull(item5, "The fifth item is null");
        ObjectHelper.requireNonNull(item6, "The sixth item is null");
        ObjectHelper.requireNonNull(item7, "The seventh item is null");
        return fromArray(item1, item2, item3, item4, item5, item6, item7);
    }

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item1, T item2, T item3, T item4, T item5, T item6, T item7, T item8) {
        ObjectHelper.requireNonNull(item1, "The first item is null");
        ObjectHelper.requireNonNull(item2, "The second item is null");
        ObjectHelper.requireNonNull(item3, "The third item is null");
        ObjectHelper.requireNonNull(item4, "The fourth item is null");
        ObjectHelper.requireNonNull(item5, "The fifth item is null");
        ObjectHelper.requireNonNull(item6, "The sixth item is null");
        ObjectHelper.requireNonNull(item7, "The seventh item is null");
        ObjectHelper.requireNonNull(item8, "The eighth item is null");
        return fromArray(item1, item2, item3, item4, item5, item6, item7, item8);
    }

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item1, T item2, T item3, T item4, T item5, T item6, T item7, T item8, T item9) {
        ObjectHelper.requireNonNull(item1, "The first item is null");
        ObjectHelper.requireNonNull(item2, "The second item is null");
        ObjectHelper.requireNonNull(item3, "The third item is null");
        ObjectHelper.requireNonNull(item4, "The fourth item is null");
        ObjectHelper.requireNonNull(item5, "The fifth item is null");
        ObjectHelper.requireNonNull(item6, "The sixth item is null");
        ObjectHelper.requireNonNull(item7, "The seventh item is null");
        ObjectHelper.requireNonNull(item8, "The eighth item is null");
        ObjectHelper.requireNonNull(item9, "The ninth item is null");
        return fromArray(item1, item2, item3, item4, item5, item6, item7, item8, item9);
    }

    @SchedulerSupport("none")
    public static <T> Observable<T> just(T item1, T item2, T item3, T item4, T item5, T item6, T item7, T item8, T item9, T item10) {
        ObjectHelper.requireNonNull(item1, "The first item is null");
        ObjectHelper.requireNonNull(item2, "The second item is null");
        ObjectHelper.requireNonNull(item3, "The third item is null");
        ObjectHelper.requireNonNull(item4, "The fourth item is null");
        ObjectHelper.requireNonNull(item5, "The fifth item is null");
        ObjectHelper.requireNonNull(item6, "The sixth item is null");
        ObjectHelper.requireNonNull(item7, "The seventh item is null");
        ObjectHelper.requireNonNull(item8, "The eighth item is null");
        ObjectHelper.requireNonNull(item9, "The ninth item is null");
        ObjectHelper.requireNonNull(item10, "The tenth item is null");
        return fromArray(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10);
    }

 看他的代码,其实内部调用了 fromArray()操作符(下面马上说到),可以理解为简化版的fromArray(),但是呢又不一样!!!

1.3 fromIterable():

        将传入的一组数据按角标一次发射出去,即发射一组数据。

    private static void test(){

        List<String> yys = new ArrayList<>();
        yys.add("一");
        yys.add("二");
        yys.add("三");
        yys.add("四");
        yys.add("五");
        Observable<String> observable = Observable.fromIterable(yys);

        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                System.out.println(s);
            }
        };
        observable.subscribe(consumer);
    }

运行结果:

1.4  fromArray():

        对一组数据进行观察,即把一组数据一次性发射被观察者(因此,观察者的onNext()只执行一次)

    private static void test(){

        List<String> yys = new ArrayList<>();
        yys.add("一");
        yys.add("二");
        yys.add("三");
        yys.add("四");
        yys.add("五");
        Observable<List<String>> observable = Observable.fromArray(yys);

        Consumer<List<String>> consumer = new Consumer<List<String>>() {
            @Override
            public void accept(List<String> s) throws Exception {
                System.out.println(s);
            }
        };
        observable.subscribe(consumer);
    }

 运行结果:

1.5 timer():

        延迟指定时长发射一个类型为long、数值为0的事件(默认在新线程发射)。他有两个重载方法:

    @SchedulerSupport("io.reactivex:computation")
    public static Observable<Long> timer(long delay, TimeUnit unit) {
        return timer(delay, unit, Schedulers.computation());
    }

    @SchedulerSupport("custom")
    public static Observable<Long> timer(long delay, TimeUnit unit, Scheduler scheduler) {
        ObjectHelper.requireNonNull(unit, "unit is null");
        ObjectHelper.requireNonNull(scheduler, "scheduler is null");
        return RxJavaPlugins.onAssembly(new ObservableTimer(Math.max(delay, 0L), unit, scheduler));
    }

示例代码:

        Observable.
                timer(5, TimeUnit.SECONDS).
                subscribe(new Observer<Long>() {
                    @Override
                    public void onSubscribe(Disposable disposable) {
                        System.out.println("onSubscribe");
                    }

                    @Override
                    public void onNext(Long aLong) {
                        System.out.println("onNext  aLong:" + aLong);
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        System.out.println("onError");
                    }

                    @Override
                    public void onComplete() {
                        System.out.println("onComplete");
                    }
                });

运行结果:

 感觉并没有按指定时长延时,另外发射的0也没收到。。。

1.6 interval():

        按照指定的时间间隔,每次发送一个事件,发送事件的序列为:默认从0开始,无限递增的整数序列(默认在新线程中进行)

1.7 intervalRange():

        作用和interval一样,但这里可以指定发送数据的个数,而interval是无限发射,除非主动停止。

1.8 range():

        发射指定范围的序列:可指定发射范围,作用同 intervalRange 一样,不同的是,range是无延迟发射。

2. 转换型操作符:

        变换被观察者发送的事件,将事件按照一定的规则变换,然后将变换后的事件发送出去。

2.1 map():

        将被观察者转换成新的被观察者发射出去,观察者收到的是新的被观察者发射出的事件。

示例代码:将int类型的值转化为string并发射,则观察者收到的就是string类型的值。

        Observable
                .just(2)
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        return "将Integer类型的: " + integer + "转化为string";
                    }
                })
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable disposable) {
                        System.out.println("onSubscribe");
                    }

                    @Override
                    public void onNext(String s) {
                        System.out.println("onNext");
                        System.out.println(s);
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        System.out.println("onError");
                    }

                    @Override
                    public void onComplete() {
                        System.out.println("onComplete");
                    }
                });

运行结果:

 2.2 flatMap():

        使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这个函数返回一个本身也发射数据的Observable,然后FlatMap合并这些Observables发射的数据,最后将合并后的结果当做它自己的数据序列发射。

        flatmap通过一个函数将原来的数据的每一项进行转换,并将返回的数据进行Observable包装,然后将所有这些Observable转换成一个Observable发射,所执行的结果可能和元数据items中数据的顺序不能保证

示例代码:

        Integer[] items = {1, 2, 3, 4, 5, 6};
        Observable.fromArray(items).flatMap(new Function<Integer, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(Integer integer) throws Exception {
                return Observable.just("flatMap----" + integer);
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable disposable) {
                System.out.println("onSubscribe");
            }

            @Override
            public void onNext(String o) {
//                System.out.println("onNext");
                System.out.println(o);
            }

            @Override
            public void onError(Throwable throwable) {
                System.out.println("onError");
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete");
            }
        });

运行结果:

2.3  concatMap():

        基本与 flatMap()类似,只是他可以保证观察者收到的和被观察者发射时的顺序。

2.4 buffer():

        将要发射的数据按照一定的间隔分成若干段,然后把分成的每一段作为一个新的被观察者发射出去,即简单理解为分组发射。他有多个重载方法:

    @SchedulerSupport("none")
    public final Observable<List<T>> buffer(int count) {
        return this.buffer(count, count);
    }

    @SchedulerSupport("none")
    public final Observable<List<T>> buffer(int count, int skip) {
        return this.buffer(count, skip, ArrayListSupplier.asCallable());
    }

    @SchedulerSupport("none")
    public final <U extends Collection<? super T>> Observable<U> buffer(int count, int skip, Callable<U> bufferSupplier) {
        ObjectHelper.verifyPositive(count, "count");
        ObjectHelper.verifyPositive(skip, "skip");
        ObjectHelper.requireNonNull(bufferSupplier, "bufferSupplier is null");
        return RxJavaPlugins.onAssembly(new ObservableBuffer(this, count, skip, bufferSupplier));
    }

    @SchedulerSupport("none")
    public final <U extends Collection<? super T>> Observable<U> buffer(int count, Callable<U> bufferSupplier) {
        return this.buffer(count, count, bufferSupplier);
    }

    @SchedulerSupport("io.reactivex:computation")
    public final Observable<List<T>> buffer(long timespan, long timeskip, TimeUnit unit) {
        return this.buffer(timespan, timeskip, unit, Schedulers.computation(), ArrayListSupplier.asCallable());
    }

    @SchedulerSupport("custom")
    public final Observable<List<T>> buffer(long timespan, long timeskip, TimeUnit unit, Scheduler scheduler) {
        return this.buffer(timespan, timeskip, unit, scheduler, ArrayListSupplier.asCallable());
    }

    @SchedulerSupport("custom")
    public final <U extends Collection<? super T>> Observable<U> buffer(long timespan, long timeskip, TimeUnit unit, Scheduler scheduler, Callable<U> bufferSupplier) {
        ObjectHelper.requireNonNull(unit, "unit is null");
        ObjectHelper.requireNonNull(scheduler, "scheduler is null");
        ObjectHelper.requireNonNull(bufferSupplier, "bufferSupplier is null");
        return RxJavaPlugins.onAssembly(new ObservableBufferTimed(this, timespan, timeskip, unit, scheduler, bufferSupplier, 2147483647, false));
    }

    @SchedulerSupport("io.reactivex:computation")
    public final Observable<List<T>> buffer(long timespan, TimeUnit unit) {
        return this.buffer(timespan, unit, Schedulers.computation(), 2147483647);
    }

    @SchedulerSupport("io.reactivex:computation")
    public final Observable<List<T>> buffer(long timespan, TimeUnit unit, int count) {
        return this.buffer(timespan, unit, Schedulers.computation(), count);
    }

    @SchedulerSupport("custom")
    public final Observable<List<T>> buffer(long timespan, TimeUnit unit, Scheduler scheduler, int count) {
        return this.buffer(timespan, unit, scheduler, count, ArrayListSupplier.asCallable(), false);
    }

    @SchedulerSupport("custom")
    public final <U extends Collection<? super T>> Observable<U> buffer(long timespan, TimeUnit unit, Scheduler scheduler, int count, Callable<U> bufferSupplier, boolean restartTimerOnMaxSize) {
        ObjectHelper.requireNonNull(unit, "unit is null");
        ObjectHelper.requireNonNull(scheduler, "scheduler is null");
        ObjectHelper.requireNonNull(bufferSupplier, "bufferSupplier is null");
        ObjectHelper.verifyPositive(count, "count");
        return RxJavaPlugins.onAssembly(new ObservableBufferTimed(this, timespan, timespan, unit, scheduler, bufferSupplier, count, restartTimerOnMaxSize));
    }

    @SchedulerSupport("custom")
    public final Observable<List<T>> buffer(long timespan, TimeUnit unit, Scheduler scheduler) {
        return this.buffer(timespan, unit, scheduler, 2147483647, ArrayListSupplier.asCallable(), false);
    }

    @SchedulerSupport("none")
    public final <TOpening, TClosing> Observable<List<T>> buffer(ObservableSource<? extends TOpening> openingIndicator, Function<? super TOpening, ? extends ObservableSource<? extends TClosing>> closingIndicator) {
        return this.buffer(openingIndicator, closingIndicator, ArrayListSupplier.asCallable());
    }

    @SchedulerSupport("none")
    public final <TOpening, TClosing, U extends Collection<? super T>> Observable<U> buffer(ObservableSource<? extends TOpening> openingIndicator, Function<? super TOpening, ? extends ObservableSource<? extends TClosing>> closingIndicator, Callable<U> bufferSupplier) {
        ObjectHelper.requireNonNull(openingIndicator, "openingIndicator is null");
        ObjectHelper.requireNonNull(closingIndicator, "closingIndicator is null");
        ObjectHelper.requireNonNull(bufferSupplier, "bufferSupplier is null");
        return RxJavaPlugins.onAssembly(new ObservableBufferBoundary(this, openingIndicator, closingIndicator, bufferSupplier));
    }

    @SchedulerSupport("none")
    public final <B> Observable<List<T>> buffer(ObservableSource<B> boundary) {
        return this.buffer(boundary, ArrayListSupplier.asCallable());
    }

    @SchedulerSupport("none")
    public final <B> Observable<List<T>> buffer(ObservableSource<B> boundary, int initialCapacity) {
        return this.buffer(boundary, Functions.createArrayList(initialCapacity));
    }

    @SchedulerSupport("none")
    public final <B, U extends Collection<? super T>> Observable<U> buffer(ObservableSource<B> boundary, Callable<U> bufferSupplier) {
        ObjectHelper.requireNonNull(boundary, "boundary is null");
        ObjectHelper.requireNonNull(bufferSupplier, "bufferSupplier is null");
        return RxJavaPlugins.onAssembly(new ObservableBufferExactBoundary(this, boundary, bufferSupplier));
    }

    @SchedulerSupport("none")
    public final <B> Observable<List<T>> buffer(Callable<? extends ObservableSource<B>> boundarySupplier) {
        return this.buffer(boundarySupplier, ArrayListSupplier.asCallable());
    }

    @SchedulerSupport("none")
    public final <B, U extends Collection<? super T>> Observable<U> buffer(Callable<? extends ObservableSource<B>> boundarySupplier, Callable<U> bufferSupplier) {
        ObjectHelper.requireNonNull(boundarySupplier, "boundarySupplier is null");
        ObjectHelper.requireNonNull(bufferSupplier, "bufferSupplier is null");
        return RxJavaPlugins.onAssembly(new ObservableBufferBoundarySupplier(this, boundarySupplier, bufferSupplier));
    }

这里只简单示例:

        Integer[] items = {1, 2, 3, 4, 5, 6};
        Observable.fromArray(items).buffer(3).subscribe(new Observer<List<Integer>>() {
            @Override
            public void onSubscribe(Disposable disposable) {
                System.out.println("onSubscribe");
            }

            @Override
            public void onNext(List<Integer> integers) {
                StringBuffer buffer = new StringBuffer();
                buffer.append("收到的list为:{");
                for (int i = 0; i < integers.size(); i++) {
                    buffer.append(integers.get(i));
                    if (i < integers.size() - 1) {
                        buffer.append(",");
                    }
                }
                buffer.append("}");
                System.out.println(buffer.toString());
            }

            @Override
            public void onError(Throwable throwable) {
                System.out.println("onError");
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete");
            }
        });

运行结果:

 另外,再示例说明下 skip 参数,即再次分组时跳过的个数。

以下将 skip 分别设为2和3,,帮助理解:

        Integer[] items = {1, 2, 3, 4, 5, 6};
        Observable.fromArray(items).buffer(3,2).subscribe(new Observer<List<Integer>>() {
            @Override
            public void onSubscribe(Disposable disposable) {
                System.out.println("onSubscribe");
            }

            @Override
            public void onNext(List<Integer> integers) {
                StringBuffer buffer = new StringBuffer();
                buffer.append("收到的list为:{");
                for (int i = 0; i < integers.size(); i++) {
                    buffer.append(integers.get(i));
                    if (i < integers.size() - 1) {
                        buffer.append(",");
                    }
                }
                buffer.append("}");
                System.out.println(buffer.toString());
            }

            @Override
            public void onError(Throwable throwable) {
                System.out.println("onError");
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete");
            }
        });
        Integer[] items = {1, 2, 3, 4, 5, 6};
        Observable.fromArray(items).buffer(3,3).subscribe(new Observer<List<Integer>>() {
            @Override
            public void onSubscribe(Disposable disposable) {
                System.out.println("onSubscribe");
            }

            @Override
            public void onNext(List<Integer> integers) {
                StringBuffer buffer = new StringBuffer();
                buffer.append("收到的list为:{");
                for (int i = 0; i < integers.size(); i++) {
                    buffer.append(integers.get(i));
                    if (i < integers.size() - 1) {
                        buffer.append(",");
                    }
                }
                buffer.append("}");
                System.out.println(buffer.toString());
            }

            @Override
            public void onError(Throwable throwable) {
                System.out.println("onError");
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete");
            }
        });

结果对比:

skip=2
skip=3

3. 合并型操作符:

        即组合多个被观察者发送的事件并发送。

4. 功能型操作符:

        辅助被观察者发哦少年宫事件时实现一定的功能需要,如错误处理、线程调度等。

5. 过滤型操作符:

        用于对被观察者发出的事件进行过滤和选择,从而让被观察者返回我们需要的数据。

6. 条件型操作符:

        类似过滤型操作符,给被观察者发送的事件加上一定,而让被观察者返回我们需要的数据。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值