RxJava 2相当于Observable.from(Iterable).firstOrDefault?

时间:2018-05-01 16:10:30

标签: rx-java rx-java2

我在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);

1 个答案:

答案 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 /驱动程序。