【问题标题】:Flowable.compose() to transform to Single or MaybeFlowable.compose() 转换为 Single 或 Maybe
【发布时间】:2019-02-02 22:24:09
【问题描述】:

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

【问题讨论】:

  • 要在基本类型之间进行转换,请使用toas 而不是compose
  • 谢谢@akarnokd 这看起来像我要找的东西。您能否将此评论作为答案发布,以便我将其标记为已接受?
  • 我不能。 SO会将其标记为仅是微不足道的/链接并将其删除。

标签: java kotlin rx-java2 reactivex


【解决方案1】:

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

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)

【讨论】:

  • 感谢您的回答。不幸的是,Kotlin 的扩展功能在我的项目中不是一个选项,因为转换器应该在其他 JVM 语言之间共享。 compose() 后跟 singleElement() 的方法也不可行,因为在实际情况下(更复杂,我只是提供了一个过于简化的示例),然后将更多逻辑应用于 Single,然后从变压器。我已经调整了这个例子来反映这个细节。所以也许我应该向 RX 开发团队提交功能请求。
猜你喜欢
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多