RxJava Observable.create не генерирует события для switchIfEmpty (наблюдаемый) - PullRequest
0 голосов
/ 21 января 2019

Я экспериментировал с операторами RxJava, столкнулся с этой проблемой и не знаю, почему она ведет себя так, как она есть. Давайте рассмотрим пример, и, надеюсь, проблема станет ясной.

У меня есть фрукты Observable, которые я создал с помощью Observable.just

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.just () делает. Я потратил пару часов на это и надеюсь, что кто-то здесь сможет ответить на вопрос.

1 Ответ

0 голосов
/ 21 января 2019

Сводка

Вам необходимо сообщить о завершении на 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

Подробнее о

...