Flowable.compose()转换为Single或Maybe

时间:2019-02-02 22:24:09

标签: java kotlin rx-java2 reactivex

RxJava2中是否有任何运算符可以应用从FlowableSingleMaybe的转换?我的意思是Flowable.compose()运算符将Transformer应用于Flowable并返回另一个Flowable。但是我需要使用一个将Flowable转换为SingleMabye的转换器,并且可以在我的应用程序中多次重复使用它而无需使用“ breaking the chain”。

示例(在Kotlin中):

fun processFirstEven(f: Flowable<Int>): Maybe<Int> {
    return f.filter { i -> i % 2 == 0 }.take(1).singleElement().map { s -> s * 12 }
}

val f: Maybe<Int> = Flowable
        .fromArray(1, 3, 5, 6, 7, 8, 9)
        .compose(::processFirstEven) // Does not compile

1 个答案:

答案 0 :(得分:0)

我认为没有一种方法可以在一行中完成这种复杂的转换。看来对我来说这已经很简单了:

fun takeFirstEven(f: Flowable<Int>): Flowable<Int> {
    return f.filter { i -> i % 2 == 0 }.take(1)
}

val f: Maybe<Int> = Flowable
    .fromArray(1, 3, 5, 6, 7, 8, 9)
    .compose(::takeFirstEven)
    .singleElement()

好消息是,如果您的目标只是可再用性,则可以使用Kotlin's function extension feature来做到这一点。

将此代码放在您的代码可以访问的位置:

fun <T> Flowable<T>.toMaybe(filter: (T) -> Boolean): Maybe<T> {
    return this.filter(filter).take(1).singleElement()
}

然后,您可以在任何需要过滤器的地方简单地使用toMaybe

fun evenFilter(i: Int) = (i % 2) == 0

val f: Maybe<Int> = Flowable
    .fromArray(1, 3, 5, 6, 7, 8, 9)
    .toMaybe(::evenFilter)