Какой оператор Rx Java сделать проще - PullRequest
1 голос
/ 06 апреля 2020

Я нашел способ сделать это проще, вместо использования двух flatmap и фильтра

val a = Observable.just(false)
val b = Observable.just(true)

val x = Observable.just(Unit)

x.flatMap { a }
 .filter { !it }
 .flatMap { b }
 .filter { it }
 .subscribe {
  // a must be false and b must be true
 }

Я хочу фильтровать, так что подписка вызывается только тогда, когда a ложно и b верно, код выше правильно, но я хочу найти способ сделать его более простым; Я пытаюсь использовать concat, но я не знаю, почему я не могу его использовать ...

1 Ответ

0 голосов
/ 06 апреля 2020

Есть несколько способов сделать это sh. Выбор решения simpler основан на мнении и зависит от того, как вы хотите обрабатывать элементы, испускаемые a и b. В то время как последнее может быть не таким очевидным при тестировании Observable.just с, когда дело доходит до более сложных Observables, вы можете увидеть разницу.

В вашем примере b подписывается только если a имеет правильное значение. Это было предназначено?

Для меня более чистым решением было бы zip их и сравнить содержимое «вместе». Но это ожидает элементы из обоих Observable, прежде чем, возможно, испустить элемент.

Observable.zip(a, b, BiFunction { a, b -> Pair(a, b) })
    .filter { !it.first && it.second }
    .subscribe {
        // a must be false and b must be true     
    }

Редактировать:

Чтобы дать вам пример другой способ сделать это, вот пример без filter:

Observable.zip(a.takeWhile { !it }, b.takeWhile { it }, BiFunction { _, _ -> Unit })
    .subscribe {
        // a must be false and b must be true
    }

(помните, что все они имеют разные ожидания на a и b)

...