亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號