RxJava Observable.create不为switchIfEmpty(observable)发出事件

时间:2019-01-20 23:22:41

标签: java rx-java2

我正在尝试RxJava运算符,遇到了这个问题,不知道为什么它的行为方式如此。 让我来看一个例子,希望问题会解决。

我有一个使用Observable.just创建的水果Observable

Observable<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()运算符将订阅我们传递给它的运算符。

使用此过滤器,我应该可以看到根据switchIfEmpty()的定义发出的果实。

pLanguages.filter(s -> s.startsWith("Z"))
                .switchIfEmpty(fruits)
                .subscribe(System.out::println, System.out::println, () -> System.out.println("Complete"));

但是我看不到任何排放物。但是,如果我像这样切换可观察对象

fruits.filter(s -> s.startsWith("Z"))
                .switchIfEmpty(pLanguages)
                .subscribe(System.out::println, System.out::println, () -> System.out.println("Complete"));

我确实看到了pLanguages观察器发出事件。我尝试调试,但不确定为什么Observable.just()可以执行,而Observable.create()不能为switchIfEmpty()运算符发出空的可观察对象。我已经花了几个小时,希望这里的人可以回答这个问题。

1 个答案:

答案 0 :(得分:3)

摘要

您需要在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();
});

科特林语(附加)

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

了解更多信息