簡體   English   中英

RxJava Observable.create不為switchIfEmpty發出事件(可觀察)

[英]RxJava Observable.create not emitting events for switchIfEmpty(observable)

我正在嘗試使用RxJava運算符並遇到了這個問題,並且不知道為什么它的行為方式如此。 讓我舉一個例子,希望問題清楚。

我有一個使用Observable.just創建的水果Observable

Observable<String> fruits = Observable.just("Apple", "Banana", "Mango", "Strawberry", "Raspberry", "Blood Oranges");

我有另一種使用Observable.create創建的語言observable

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.cre()沒有為switchIfEmpty()運算符發出一個空的observable而Observable.just()。 我花了幾個小時來做​​這件事,希望有人能回答這個問題。

摘要

您需要在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

了解更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM