RxJava过滤器'否则'

时间:2016-06-07 13:42:16

标签: android reactive-programming rx-android

我想将我的observable分割为vertical-align: middle;语句

类似的东西:

if/else

甚至可能吗?

3 个答案:

答案 0 :(得分:3)

在Observable中不能以这种方式工作,你必须认为observable就像一个流,你最终可以得到一些项目,其他人。 您将在observable中找到的最接近的if / else将使用GroupsBy。

这里有一些实例,我解释了如何工作

https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/transforming/ObservableGroupBy.java

答案 1 :(得分:2)

实现此行为的一种方法是订阅您的数据两次并以不同方式对其进行过滤:

Subscription subscriptionA = Observable.from(array)
    .filter(a -> condition(a))
    .subscribe(...) // <-- do stuff for condition A

Subscription subscriptionB = Observable.from(array)
    .filter(a -> complexCondition(a))
    .subscribe(...) // <-- do stuff for condition B

答案 2 :(得分:0)

要扩展Ken's answer,另一个选项是使用replay operator将Observable“分叉”到两个分支中。这保证了原始的observable只被调用一次。如果在链中某处有一些昂贵的处理或副作用,这很有用:

ConnectableObservable<A> connectable = Observable.fromArray()
    .replay();

connectable
    .filter(a -> condition(a))
    .// <--- do stuff  if condition returns true

connectable.connect(); // do this after the first branch

connectable
    .filter(a -> complexCondition(a)) // filter all elements(!)
    .// <--- do stuff if complex condition returns true

connectable
    .// <- iterate all elements

请记住,所有分支都必须同时处理onNext和onError事件。