RxJava 算术和聚合操作符

ReactiveX 系列文章目录


concat/concatDelayError/concatArray/concatArrayDelayError

将多个被观察者按先后顺序串联起来。

// 前面有 2-4 个 ObservableSource 参数,内部调用的都是 concatArray
public static  Observable concat(ObservableSource source1, ObservableSource source2)

// 数组和集合,意思一样
public static  Observable concat(Iterable> sources)            
public static  Observable concatArray(ObservableSource... sources)
Observable.concat(observableStr, observableInt, observableBoolean)
           .subscribe(Consumer {
               textView.text = "${textView.text}\nonNext $it"
           })

将依次连续发送 observableStr,observableInt,observableBoolean 里的 12 个数据。


// 区别在于有个参数 prefetch,和 combineLatest 的 buffersize 作用一样
public static  Observable concat(ObservableSource> sources)
public static  Observable concat(ObservableSource> sources, int prefetch)

这两个重载方法,不知道怎么用,试验了若干次,终于不崩溃了。

Java 语言版本:

Observable observable = Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter emitter) {
            emitter.onNext(observableInt);
            emitter.onNext(observableStr);
        }
    });

Observable.concat(observable).subscribe(new Consumer() {
    @Override
    public void accept(Object o) {
        Log.e("RX", o.toString());
    }
});

Kotlin 语言版本

val observable = Observable.create> { emitter ->
    emitter.onNext(observableInt)
    emitter.onNext(observableStr)
}

Observable.concat(observable)
        .subscribe({ o -> Log.e("RX", o!!.toString()) })

最终打出的日志按顺序是 1,2,3,4,5,a,b,c

concatDelayError 和 concatArrayDelayError 是推迟发射 onError。

concatEager/concatArrayEager

public static  Observable concatArrayEager(ObservableSource... sources)
public static  Observable concatArrayEager(int maxConcurrency, int prefetch, ObservableSource... sources)

// 集合和上面的可变参数可以看成一样的
public static  Observable concatEager(Iterable> sources)
public static  Observable concatEager(Iterable> sources, int maxConcurrency, int prefetch)

public static  Observable concatEager(ObservableSource> sources)
public static  Observable concatEager(ObservableSource> sources, int maxConcurrency, int prefetch)

注释:

Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the
source ObservableSources. The operator buffers the values emitted by these ObservableSources and then drains them
in order, each one after the previous one completes.

意思大概是说,一旦有观察者订阅了之后,会先将被观察者发射的数据缓存起来,然后将缓存的数据一个接一个的发射出去。

对于外部调用来说,结果和 concat 作用没什么区别。它是并发处理多个 Observable,而不像 concat 那样串行处理,但是又能够保证最终的顺序。

Observable.concatArrayEager(observableStr, observableInt, observableBoolean).subscribe({
    Log.e("RX", it.toString())
})

依次发射三个 Observable 的数据。


有重载方法的参数是 ObservableSource> sources 应该和 concat 里用这个参数的重载方法差不多,就不写代码测试了。

concatWith

public final Observable concatWith(ObservableSource other) {
    ObjectHelper.requireNonNull(other, "other is null");
    return concat(this, other);
}

非静态,自己和别人 concat。

collect/collectInto

收集发射的数据到一个数据结构里,然后将这个结构作为一个整体发射出去。

Observable.just(18, "China", "Ma")
    .collect(Callable> {
        arrayListOf()
    }, BiConsumer, Any> {
        t1, t2 ->  t1.add(t2)
    }).subscribe(Consumer> {
        Log.e("RX", "$it")
    })

将三个零散的数据收集到一个列表里,最后收到 [18, China, Ma]

collectInto 是将数据结构直接作为第一个参数传进去,而不需要通过回调提供一个数据结构。

Observable.just(18, "China", "Ma")
    .collectInto(arrayListOf()
    , BiConsumer, Any> {
        t1, t2 ->  t1.add(t2)
    }).subscribe(Consumer> {
        Log.e("RX", "$it")
    })

count

返回发射的数目,并且将这个数目作为一个 64 位的 long 型值以 Single 发射出来。

Observable.just(20,30,40).count()
        .subscribe(object : SingleObserver {
            override fun onSuccess(t: Long) {
                textView.text = "${textView.text}\n $t"
            }

            override fun onSubscribe(d: Disposable) {
            }

            override fun onError(e: Throwable) {
            }
})

reduce/reduceWith

// 返回 Maybe
public final Maybe reduce(BiFunction reducer)
// 有初始值,返回 Single
public final  Single reduce(R seed, BiFunction reducer)
// 通过一个回调获取初始值
public final  Single reduceWith(Callable seedSupplier, BiFunction reducer)

一种累计运算。

// 算乘积,结果是 6
Observable.just(1, 2, 3)
  .reduce({ t1, t2 -> t1 * t2 }).subscribe {
      textView.text = "${textView.text}\n $it"
  }

// 有初始值 10,结果是 60
Observable.just(1, 2, 3)
    .reduce(10, { t1, t2 -> t1 * t2 })
    .subscribe(object: SingleObserver {
        override fun onSuccess(t: Int) {textView.text = "${textView.text}\n $t"}
        override fun onSubscribe(d: Disposable) {}
        override fun onError(e: Throwable) {}
    })

// 有初始值 8,结果是 48
Observable.just(1, 2, 3)
    .reduceWith({ 8 }, { t1, t2 -> t1 * t2 })
    .subscribe(object: SingleObserver {
        override fun onSuccess(t: Int) {textView.text = "${textView.text}\n $t"}
        override fun onSubscribe(d: Disposable) {}
        override fun onError(e: Throwable) {}
    })

你可能感兴趣的:(RxJava 算术和聚合操作符)