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 条评论
登录 后参与评论

相关文章

来自专栏小工匠技术圈

【小工匠聊密码学】--对称加密--3DES

  3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于...

1062
来自专栏技术博文

php des 加密解密实例

des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在Php中使用des加密,需要先安装mcrypt扩展...

48210
来自专栏Hongten

PBE_Password-based encryption(基于密码加密)_项目中你也可以有

中说道了PBE——Password-based encryption(基于密码加密)。我也做测试了一下,现在把我做的效果给大家演示一下:

1011
来自专栏闻道于事

Java使用AES加密解密

5213
来自专栏WindCoder

进击微信小程序-Java版AES/CBC/PKCS7Padding加解密字符串

进击微信小程序,最初找到腾讯云给的解决方案,无奈后端是node.js,而且才一开始配上去还不能用,之后仔细看readme,摸到它开源的Wafer,本来以为找到终...

3452
来自专栏三流程序员的挣扎

RxJava 创建操作符

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

2431
来自专栏Hongten

java开发_MD5_加密算法

1882
来自专栏freesan44

三重Des对称加密在Android、Ios 和Java 平台的实现

如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在android、ios、java平台的使用方法;

1271
来自专栏Ryan Miao

AES加密

package com.test.util.encrypt; import org.apache.commons.lang3.StringUtils; imp...

37610
来自专栏数据结构与算法

08:Vigenère密码

08:Vigenère密码 总时间限制: 1000ms 内存限制: 65536kB描述 16世纪法国外交家Blaise de Vigenère设计了一种多表...

4599

扫码关注云+社区

领取腾讯云代金券