为了账号安全,请及时绑定邮箱和手机立即绑定

RxJava Observable.create 不为 switchIfEmpty

RxJava Observable.create 不为 switchIfEmpty

呼如林 2022-05-12 18:54:51
我正在试验 RxJava 运算符并遇到了这个问题,但不知道它为什么会这样。让我看一个例子,希望问题会很清楚。我有一个使用 Observable.just 创建的水果 ObservableObservable<String> fruits = Observable.just("Apple", "Banana", "Mango", "Strawberry", "Raspberry", "Blood Oranges");我使用 Observable.create 创建了另一种可观察的语言Observable<String> pLanguages = Observable.create(emitter -> {            emitter.onNext("Kotlin");            emitter.onNext("Java");            emitter.onNext("Python");            emitter.onNext("Javascript");            emitter.onNext("Go");            emitter.onNext("C");            emitter.onNext("Rust");        });switchIfEmpty() 操作符将订阅我们传递给它的操作符,如果源操作符没有发出任何 observables。使用这个过滤器,我应该会看到基于 switchIfEmpty() 定义的结果。pLanguages.filter(s -> s.startsWith("Z"))                .switchIfEmpty(fruits)                .subscribe(System.out::println, System.out::println, () -> System.out.println("Complete"));但我没有看到任何排放。但是,如果我像这样切换 observablesfruits.filter(s -> s.startsWith("Z"))                .switchIfEmpty(pLanguages)                .subscribe(System.out::println, System.out::println, () -> System.out.println("Complete"));我确实看到 pLanguages 观察者发出事件。我尝试调试但不确定为什么 Observable.create() 没有为 switchIfEmpty() 运算符发出空的 observable 而 Observable.just() 发出。我在这上面花了几个小时,希望这里有人能回答这个问题。
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

概括


您需要在languages源上发出完成信号


示例(基于提供的源代码)


Observable<String> pLanguages = Observable.create(emitter -> {

    emitter.onNext("Kotlin");

    emitter.onNext("Java");

    emitter.onNext("Python");

    emitter.onNext("Javascript");

    emitter.onNext("Go");

    emitter.onNext("C");

    emitter.onNext("Rust");

    emitter.onComplete();

});

Kotlin 中的示例 (addt'l)


fun main(args: Array<String>) {

    val numbers = Observable.just("one", "two", "three")

    val languages = Observable.create<String> { emitter ->

        emitter.onNext("java")

        emitter.onNext("kotlin")

        emitter.onNext("swift")

        emitter.onComplete() // <-- Invoke this

    }


    languages

            .filter { s -> s.toLowerCase().startsWith("z") }

            .switchIfEmpty(numbers)

            .subscribe({

                System.out.println(it)

            }, {

                System.out.println(it)

            })


    numbers

            .filter { s -> s.toLowerCase().startsWith("z") }

            .switchIfEmpty(languages)

            .subscribe({

                System.out.println(it)

            }, {

                System.out.println(it)

            })



}

输出


one

two

three

java

kotlin

swift

阅读更多


http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Emitter.html


查看完整回答
反对 回复 2022-05-12
  • 1 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号