我经常使用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的用例,是真的吗?
我的问题:
答案 0 :(得分:2)
我的问题是有效的还是实现之间的差异可以忽略不计?
blockingGet
阻止了当前线程,因此您几乎可以肯定不想在测试之外调用它。第二个例子是正确的方法。
是否有任何一种解决方案比其他解决方案更好/更适合该库,如果是这样,为什么并且有合理的理由使用blockingGet那么?
主要测试。很少或很少,当使用完全同步的代码时,阻塞实际上不会发生。
了解ReactiveX的深度
没有关于这个深度的书。所有有关RxJava的书都很好阅读。