RxJava 条件和布尔操作符

ReactiveX 系列文章目录


amb/ambArray/ambWith

public static  Observable amb(Iterable> sources)

public static  Observable ambArray(ObservableSource... sources)

两个方法参数稍有不同,但用法含义一样。

多个 Observable 中,无论发射的是 onNext 还是 onComplete 或者 onError,只接受第一个发射数据的那个 Observable,其它 Observable 发射的数据都被忽略。

Observable.ambArray(Observable.just(1).delay(100, TimeUnit.MILLISECONDS), Observable.just(2))
         .subscribe( { textView.text = "${textView.text}\n $it"})

ambWith 的内部也是 ambArray

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

sequenceEqual

发射的数据要相同,发射的顺序要相同,终止状态 也要相同。

Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(1))
                .subscribe(Consumer {
                    textView.text = "${textView.text}\n 两个观察者 ${if(it) "相同" else "不同"}"
                })

有一个重载方法,可以自己控制认为相等的规则

public static  Single sequenceEqual(ObservableSource source1, ObservableSource source2,
          BiPredicate isEqual)
Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(6, 7, 8)
      , BiPredicate{t1, t2 -> t1%5 == t2%5 })
          .subscribe(Consumer {
              textView.text = "${textView.text}\n 两个观察者 ${if(it) "相同" else "不同"}"
          })

结果认为这两个 Observable 是一样的。

all

对发射的数据做判断,如果全都满足某种条件才返回 true,否则返回 false。

Observable.just(1,2,3,4).all { it%2==0 }
                    .subscribe { t ->
                        textView.text = "${textView.text}\n ${if(t) "都是偶数" else "不全是偶数"}"
                    }

any

有一个符合条件就是 true。

Observable.just(1,2,3,4).any { it%2==0 }
      .subscribe { t ->
          textView.text = "${textView.text}\n ${if(t) "有偶数" else "没有偶数"}"
      }

contains

包含某个数返回 true,否则返回 false。

Observable.just(1,2,3,4).contains(2)
      .subscribe { t ->
          textView.text = "${textView.text}\n ${if(t) "包含 2" else "不包含 2"}"
      }

isEmpty

判断发射数据是否为空

// 非空
Observable.just(1,2,3,4).isEmpty
.subscribe { t ->
    textView.text = "${textView.text}\n ${if(t) "空" else "非空"}"
}

// 空
Observable.create(ObservableOnSubscribe {
    it.onComplete()
}).isEmpty.subscribe { t -> textView.text = "${textView.text}\n ${if(t) "空" else "非空"}"}

defaultIfEmpty

如果 Observable 正常终止后仍然没有发射任何数据,就发射一个默认值。

// 发射
// onNext(1)
Observable.create(ObservableOnSubscribe { emitter ->
    emitter.onNext(1)
}).defaultIfEmpty(111).subscribe(observerInt)

// 发射
// onError()
Observable.create(ObservableOnSubscribe { emitter ->
     emitter.onError(Throwable())
}).defaultIfEmpty(111).subscribe(observerInt)

// 发射
// onNext(111)
// onComplete()
Observable.create(ObservableOnSubscribe { emitter ->
    emitter.onComplete()
}).defaultIfEmpty(111).subscribe(observerInt)

switchIfEmpty

如果 Observable 正常终止后仍然没有发射任何数据,就使用另一个 Observable。defaultIfEmpty 只能发一个值,而 switchIfEmpty 可以通过 Observable 返回多个值。

// onNext(1)
// onNext(2)
// onComplete
val other = Observable.just(1,2)
Observable.empty().switchIfEmpty(other).subscribe(observerInt)
Observable.create(ObservableOnSubscribe { it.onComplete() })
        .switchIfEmpty(other).subscribe(observerInt)

你可能感兴趣的:(RxJava 条件和布尔操作符)