RxJava:如何在不破坏链条的情况下有条件地将操作符应用于Observable

时间:2016-03-17 10:48:41

标签: java android system.reactive rx-java

我在RxJava observable上有一系列运算符。我希望能够根据布尔值应用两个运算符中的一个而不用#34;打破链#34;

我对Rx(Java)相对较新,我觉得这样做可能比我目前引入临时变量的方法更具惯用性和可读性。

这是一个具体的例子,如果批量大小字段为非空,则从observable缓冲项目,否则用toList()发出单批无限大小:

Observable<Item> source = Observable.from(newItems);
Observable<List<Item>> batchedSource = batchSize == null ?
                source.toList() :
                source.buffer(batchSize);
return batchedSource.flatMap(...).map(...)

这样的事情可能吗? (伪lambda因为Java):

Observable.from(newItems)
    .applyIf(batchSize == null,
             { o.toList() },
             { o.buffer(batchSize) })
    .flatMap(...).map(...)

2 个答案:

答案 0 :(得分:12)

您可以使用compose(Func1)按顺序保留但执行自定义行为

source
.compose(o -> condition ? o.map(v -> v + 1) : o.map(v -> v * v))
.filter(...)
.subscribe(...)

答案 1 :(得分:1)

如果您要发出单个值,也可以将filter运算符与defaultIfEmpty一起使用,如果要使用另一个Observable发出多个值,则可以将switchIfEmpty用作操作符。

val item = Observable.just("ABC")

item.filter { s -> s.startsWith("Z") }
    .defaultIfEmpty("None")
    .subscribe { println(it) }