【问题标题】:RxJava Observable.create not emitting events for switchIfEmpty(observable)RxJava Observable.create 不为 switchIfEmpty(observable) 发出事件
【发布时间】:2019-01-20 23:22:40
【问题描述】:

我在试验 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.create() 没有为 switchIfEmpty() 运算符发出空的 observable 而 Observable.just() 发出。我在这上面花了几个小时,希望这里有人能回答这个问题。

【问题讨论】:

    标签: java rx-java2


    【解决方案1】:

    总结

    您需要在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 中的示例(添加)

    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
    

    了解更多

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多