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