在RxJava中,如何在链接observable时传递变量?

Jul*_* Go 70 java reactive-programming rx-java flatmap

我正在使用RxJava链接异步操作,我想将一些变量传递到下游:

Observable
   .from(modifications)
   .flatmap( (data1) -> { return op1(data1); })
   ...
   .flatmap( (data2) -> { 
       // How to access data1 here ?
       return op2(data2);
   })
Run Code Online (Sandbox Code Playgroud)

这似乎是一种常见的模式,但我无法找到有关它的信息.

Jul*_* Go 57

我从Couchbase论坛获得的建议是使用嵌套的observable:

Observable
   .from(modifications)
   .flatmap( (data1) -> { 
       return op1(data1)
           ...
           .flatmap( (data2) -> { 
               // I can access data1 here
               return op2(data2);
           })
   });
Run Code Online (Sandbox Code Playgroud)

编辑:我会将此标记为已接受的答案,因为它似乎是最推荐的.如果您的处理过于复杂而无法嵌套所有内容,您还可以使用函数调用来检查解决方案.


Jul*_* Go 13

另一种可能性是将结果映射op1org.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());
   })
Run Code Online (Sandbox Code Playgroud)

它的工作原理但让变量隐藏在Pair/Triple /中感觉有点不舒服......如果使用Java 6表示法,它会变得非常冗长.

我想知道是否有更好的解决方案,也许一些RxJava运营商可以提供帮助?

  • 我不认为这样做有什么不妥,但每当我觉得我需要达到Pair课程时,我也觉得我做错了什么.我使用它的次数,然后一旦我对我的域有了更好的理解,就会重新考虑它. (2认同)

Jul*_* Go 6

一种可能性是使用函数调用:

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); })
Run Code Online (Sandbox Code Playgroud)

但是:如果我错了,请纠正我,但是这不像是反应式编程的方式

  • 这与您的第一种选择有很大不同吗? (2认同)

Sis*_*hus 6

flatmap可能需要第二个arg:

Observable.just("foo")
                .flatMap(foo -> Observable.range(1, 5), Pair::of)
                .subscribe(pair -> System.out.println("Result: " + pair.getFirst() + " Foo: " + pair.getSecond()));
Run Code Online (Sandbox Code Playgroud)

来源:https : //medium.com/rxjava-tidbits/rxjava-tidbits-1-use-flatmap-and-retain-original-source-value-4ec6a2de52d4