【问题标题】:How to return Observable.empty() if observable.filter().first() returns nothing?如果 observable.filter().first() 什么都不返回,如何返回 Observable.empty()?
【发布时间】:2018-11-06 13:26:59
【问题描述】:

我在 RxJava 中有一个函数,它试图根据条件查找事物,如果成功,它会转换并将其作为 Observable 返回。如果找不到任何东西,我想返回Observable.empty(),因此没有第一个。 我对此不确定,但我认为如果过滤器过滤掉Observable 中的每个元素,结果将是Observable.empty() 无论如何(没有firstElement())。

void Observable<Thing> transformFirst(Observable<Thing> things,Predicate<Thing> condition){
  return things
    .filter(condition)
    .firstElement()
    .map(firstThing ->{...do sg...})
}

编辑:

我的问题是firstElement() 返回一个Maybe&lt;Thing&gt;,当filter(condition) 过滤掉所有内容时,我不知道如何将其转换为Observable.empty()condition 对每个thing 进行评估为 false)

【问题讨论】:

  • things.filter(condition)condition 的计算结果始终为 falseObservable.empty() 有何不同?
  • 我觉得没什么不同,我相信会是Observable.empty()。但是当我做things.filter(condition).firstElement() 它会返回一个Maybe&lt;Thing&gt; 我不知道如何把它变成Observable.empty()
  • 那你为什么用firstElement()呢?
  • 或许你应该使用.first(condition) 然后...
  • Observable.empty() 是一个恒定的空源,与经过过滤并最终没有项目的任意 Observable 不同。为什么不继续使用Maybe,这表明您可能有也可能没有物品。充其量您可以通过toObservable() 将其转换回Observable

标签: rx-java rx-java2 reactivex


【解决方案1】:

可以如下图添加switchIfEmpty(),

return things
    .filter(condition)
    .switchIfEmpty(Observable.empty())
    .firstElement()
    .map(firstThing ->{...do sg...})

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 2012-06-18
    • 2018-09-10
    • 2017-02-14
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多