在RxJava中,如何在链接可观察的时候传递一个variables?
我使用RxJava链接asynchronous操作,并且想要向下游传递一些variables:
Observable .from(modifications) .flatmap( (data1) -> { return op1(data1); }) ... .flatmap( (data2) -> { // How to access data1 here ? return op2(data2); })
这似乎是一个普遍的模式,但我无法find有关它的信息。
我从Couchbase论坛得到的build议是使用嵌套的observables:
Observable .from(modifications) .flatmap( (data1) -> { return op1(data1) ... .flatmap( (data2) -> { // I can access data1 here return op2(data2); }) });
编辑:我将这标记为接受的答案,因为它似乎是最推荐的。 如果你的处理过于复杂,不能嵌套所有的东西,你也可以用函数调用来检查解决scheme。
另一种可能性是将op1
的结果映射到包含该variables的org.apache.commons.lang3.tuple.Pair
,并将其传递给:
Observable .from(modifications) .flatmap( (data1) -> { return op1(data1).map( obj -> { return Pair.of(data1,obj); }); }) ... .flatmap( (dataPair) -> { // data1 is dataPair.getLeft() return op2(dataPair.getRight()); })
它可以工作,但是如果将variables隐藏在Pair / Triple / …中,则感觉有点不舒服,如果使用Java 6符号,变得非常冗长。
我想知道是否有更好的解决scheme,也许一些RxJava运营商可以提供帮助?
一种可能性是使用函数调用:
private static Observable<T> myFunc(final Object data1) { return op1(data1) ... .flatmap( (data2) -> { // I can access data1 here return op2(data2); }); } Observable .from(modifications) .flatmap( (data1) -> { return myFunc(data1); })
但是:纠正我,如果我错了,但它不喜欢做反应编程的方式
解决scheme在这个线程上工作,但对于复杂的链,它使代码难以阅读,我不得不传递多个值,我所做的是创build一个私有类的所有参数,我觉得代码更可读性这种方式,
private class CommonData{ private string data1; private string data2; *getters and setters* } ... final CommonData data = new CommonData(); Observable .from(modifications) .flatmap( (data1) -> { data.setData1(data1); return op1(data1); }) ... .flatmap( (data2) -> { data2 = data.getData1() + "data 2... "; data.setData2(data2); return op2(data2); })
希望能帮助到你