RxJava';创建vs可观察。只是(1)平面图

RxJava';创建vs可观察。只是(1)平面图,java,reactive-programming,rx-java,Java,Reactive Programming,Rx Java,我一直在做一些RxJava,我经常发现自己需要将一些现有的代码结果转换为可观察的结果 例如,让我们看一下: ListenableFuture result=request.executeAsync(); 返回结果; 因此,将其转换为可观测的最简单的方法是 ListenableFuture result=request.executeAsync(); 从(结果)中可观察到的返回; 问题是,executeAsync在调用请求时实际执行请求。我想要的是延迟调用,直到可观察对象被订阅 我想到了两种方

我一直在做一些RxJava,我经常发现自己需要将一些现有的代码结果转换为可观察的结果

例如,让我们看一下:

ListenableFuture result=request.executeAsync();
返回结果;
因此,将其转换为可观测的最简单的方法是

ListenableFuture result=request.executeAsync();
从(结果)中可观察到的返回;
问题是,
executeAsync
在调用请求时实际执行请求。我想要的是延迟调用,直到可观察对象被订阅

我想到了两种方法

return Observable.create{aSubscriber->
如果(!aSubscriber.unsubscribed){
assubscriber.onNext(request.executeAsync())
}
如果(!aSubscriber.unsubscribed){
assubscriber.onCompleted()
}
}

可观察返回
.just(1)
.flatMap(())->Observable.from(request.executeAsync());
在我看来,使用flatMap选项更简单,因为我不必担心订户逻辑

在使用
flatMap
而不是
create
时是否存在任何陷阱?有没有更好的接收方式来简化集成?


谢谢

您可以改用延迟:

Observable.defer(() -> request.executeAsync())
          .concatMap(Observable::from)
          .subscribe();
是一个小型库,可为您将
可列出的未来
转换为
可观察的
,因此您最好使用它,而不是“自制”解决方案。 它允许你写作

ListenableFutureObservable.from(request.executeAsync(), Schedulers.computation())

根据请求的作用,您必须选择正确的计划程序。

Whops。回答得太快:延迟解决不了你的问题。我必须问:这怎么解决不了我的问题?在我看来,它会推迟调用,直到订阅了可观察对象。还是我误解了文档?因为它将发出
ListenableFuture
,而不是
ListenableFuture
的值。因此,我编辑我的答案以发出值。这看起来是可行的,但我会选择
Observable.defer(()->Observable.from(request.executeAsync())
。我是否遗漏了什么,或者这会像我预期的那样?事实上,create()比flatMap()有更多的陷阱。实际上,我的帖子中没有自制的东西。这都是基本的内置RxJava。我不确定你的建议与RxJava的
可观察的.from(request.executeAsync())
相比会有什么改变,因为这在任何情况下都会在请求被调用时立即执行。@crystak你是对的,我的建议也必须包装在
可观察的.defer
中。但是,您建议的
Observable.defer(()->Observable.from(request.executeAsync())
更简单,所以您可以直接使用它(除非您希望在RxJava线程池上运行请求,否则RxJavaGuava会很有帮助)。好的,谢谢。仅供参考,我认为您也可以使用
Observable.from(Future,Scheduler)