专栏首页三流程序员的挣扎RxJava 条件和布尔操作符

RxJava 条件和布尔操作符

ReactiveX 系列文章目录


amb/ambArray/ambWith

public static <T> Observable<T> amb(Iterable<? extends ObservableSource<? extends T>> sources)

public static <T> Observable<T> ambArray(ObservableSource<? extends T>... 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<T> ambWith(ObservableSource<? extends T> other) {
    ObjectHelper.requireNonNull(other, "other is null");
    return ambArray(this, other);
}

sequenceEqual

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

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

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

public static <T> Single<Boolean> sequenceEqual(ObservableSource<? extends T> source1, ObservableSource<? extends T> source2,
          BiPredicate<? super T, ? super T> isEqual)
Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(6, 7, 8)
      , BiPredicate<Int, Int>{t1, t2 -> t1%5 == t2%5 })
          .subscribe(Consumer<Boolean> {
              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<Any> {
    it.onComplete()
}).isEmpty.subscribe { t -> textView.text = "${textView.text}\n ${if(t) "空" else "非空"}"}

defaultIfEmpty

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

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

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

// 发射
// onNext(111)
// onComplete()
Observable.create(ObservableOnSubscribe<Int> { 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<Int>().switchIfEmpty(other).subscribe(observerInt)
Observable.create(ObservableOnSubscribe<Int> { it.onComplete() })
        .switchIfEmpty(other).subscribe(observerInt)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RxJava 组合操作符

    现在看上面的最后一个方法,最后一个参数是多个 Observable,第二个参数 bufferSize 是内部缓冲队列的大小。

    七适散人
  • RxJava 创建操作符

    内部触发对 Observer 的 onNext 方法的调用,just 中传递的参数将直接在 onNext 方法中接收到,参数的类型要和 Observer 的泛型...

    七适散人
  • RxJava 错误处理操作符

    在源 Observable 遇到错误时,立即停止源 Observable 的数据发送,并用新的 Observable 对象进行新的数据发送。

    七适散人
  • 谈谈FRP和Observable(二)

    有些读者看了上篇文章之后第一个问题就是「这货performance如何,吃不吃内存」。仿佛他们一下子看穿了Signal/Observable的「软肋」:低效且内...

    tyrchen
  • Android技能树 — Rxjava取消订阅小结(2):RxLifeCycle

    现在很多项目都在使用Rxjava了,对于RxJava的使用,估计都很熟悉了,但是很多人在使用RxJava的时候容易产生内存泄漏问题,比如我们在用RxJava配合...

    青蛙要fly
  • 深度 | 苹果博客解读iPhone上的人脸识别深度神经网络

    机器之心
  • prometheus2.0 联邦的配置

    prometheus2.0 在参数上有原先的1.X有较大的变化,很多参数被去掉了。另外优化了CPU占用、存储空间占用等,具体可以看官方文档。

    二狗不要跑
  • 3D建模(Blender)+实例演示透明材质和5毛光晕特效

    不知道为什么,明明只想安安静静的科研(搬铅砖,一块22斤)。却发现自己,不会P图是不行的,毕竟你总想在自己的PPT里面突出点什么;不会视频剪辑、不会Gif动图,...

    梁佐佐
  • unicode中的‘\xa0’字符在转换成gbk编码时会出现问题,gbk无法转换'\xa0'字符。

    unicode中的‘\xa0’字符在转换成gbk编码时会出现问题,gbk无法转换’\xa0’字符。 所以,在转换的时候必需进行一些前置动作:

    学到老
  • 基于 Kubernetes,Helm 及 Jenkins 实现弹性 CI/CD

    让我们在 Kubernetes 上创建一个CI/CD(持续集成和持续部署)解决方案,使用 Jenkins 作为构建工具,并使用 Traefik 作为用于灵活应用...

    DevOps时代

扫码关注云+社区

领取腾讯云代金券