我什么时候应该使用blockingGet?

时间:2019-06-17 07:40:13

标签: rx-java reactivex

我经常使用RxJava进行工作,并看到了一些示例,这些示例调用一个方法,该方法返回一个Observable或Single,然后对其调用BlockingGet,以在另一个方法中使用结果。我以为这可能是对图书馆和概念的滥用,但我可能是错的。我将举一个小例子:

   public Observable<String> getStrings(){
     // return sg
   }

   public Observable<String> getNames(){
     // return names
   }

   public Observable<String> filterNamesInStrings() {
     List<String> names = getNames().toList().blockingGet();

     return getStrings().filter(str -> /*is str in names list*/)
   }   

filterNamesInStrings也可以通过以下方式解决:

   getNames()
    .toList()
    .flatMapObservable(names-> 
       getStrings().filter(str -> /*is str in names list*/)

我的直觉是第二种解决方案更好,但是我唯一的原因是我对使用阻塞有种感觉,这使我们打破了可观察的链条,失去了懒惰(我不确定Rx有多懒)但是我没有发现任何东西可以证明我的观点,也没有进一步解释第二点更好的理由。另外,如果我是对的,那么除了快速测试之外,没有其他任何阻塞get的用例,是真的吗?

我的问题:

  • 我的问题是有效的还是实现之间的差异可以忽略不计?
  • 是否有任何一种解决方案比其他解决方案更好/更适合该库,如果是这样,为什么并且有正当的理由使用blockingGet那么?
  • (可选:您能推荐我一本关于理解ReactiveX深度的好书吗,所以我可以对诸如此类的问题进行解释,而且“便捷的做法”清单/书也很方便)

1 个答案:

答案 0 :(得分:2)

  

我的问题是有效的还是实现之间的差异可以忽略不计?

blockingGet阻止了当前线程,因此您几乎可以肯定不想在测试之外调用它。第二个例子是正确的方法。

  

是否有任何一种解决方案比其他解决方案更好/更适合该库,如果是这样,为什么并且有合理的理由使用blockingGet那么?

主要测试。很少或很少,当使用完全同步的代码时,阻塞实际上不会发生。

  

了解ReactiveX的深度

没有关于这个深度的书。所有有关RxJava的书都很好阅读。