我在RxJava 1中有以下内容,它返回Observable<SomeObject>
:
// objects is a List<SomeObject>
return rx.Observable.from(objects)
.firstOrDefault(aDefaultObject, new Func1<SomeObject, Boolean>() {
@Override
public Boolean call(SomeObject aObject) {
return aObject.isSomething();
}
});
我的目标是返回io.reactivex.Single<SomeObject>
(RxJava 2)
我怎样才能做到这一点?
我想出了如下内容,是不是正确?:
return Flowable.fromIterable(objects).filter(new Predicate<SomeObject>() {
@Override
public boolean test(SomeObject aObject) throws Exception {
return aObject.isSomething();
}
}).first(aDefaultObject);
答案 0 :(得分:0)
感谢@marianosimone,正确的解决方案是:
Flowable
{{1}}也有效但official docs不建议使用:<
何时使用Observable
- 最长流量不超过1000个元素:即,随着时间的推移,元素很少,因此在您的应用程序中几乎没有机会使用OOME。
- 您处理GUI事件,例如鼠标移动或触摸事件:这些事件很少能够合理地反压并且不那么频繁。您可以使用Observable处理1000 Hz或更低的元素频率,但无论如何都要考虑使用采样/去抖动。
- 您的流程基本上是同步的,但您的平台不支持Java Streams,或者您错过了它的功能。使用Observable通常比Flowable具有更低的开销。 (您还可以考虑针对支持Java 6+的可迭代流程优化的IxJava)
何时使用Flowable
- 处理在某处以某种方式生成的10k +元素,因此链可以告诉源限制它产生的量。
- 从磁盘读取(解析)文件本质上是阻塞和基于拉取的,在控制时可以很好地处理背压,例如,对于指定的请求数量,您从此读取了多少行。)
- 通过JDBC从数据库读取也是阻塞和基于拉取的,并且可以通过调用ResultSet.next()来控制每个下游请求。
- 网络(流)IO,其中网络帮助或使用的协议支持请求一些逻辑量
- 许多阻塞和/或基于拉的数据源,最终可能会在未来获得非阻塞的反应API /驱动程序。