如何访问上游对象,稍后在RxJava2中下游

时间:2017-05-20 21:27:34

标签: rx-java2

假设我有这种可观察的情况:

public void main() {
    Observable.fromIterable(Arrays.asList(1, 2, 3, 4, 5))
            .flatMap(id -> getEvenOdd(id))
            .map(string -> {
                // I now want to join string 
                // AND the last emitted ID integer
                return null;
            });
}

private Observable<String> getEvenOdd(Integer id) {
    if (id % 2 == 0) {
        return Observable.just("even");
    } else {
        return Observable.just("odd");
    }
}

flatmap已将Integer转换为String。我现在如何才能访问map内的整数?

我知道我可以添加doOnNext并缓存整数:

private Integer intCache; 

public void main() {
    Observable.fromIterable(Arrays.asList(1, 2, 3, 4, 5))
            .doOnNext(integer -> intCache = integer)
            .flatMap(id -> getEvenOdd(id))
            .map(string -> {
                return intCache.toString() + " " + string;
            });

但是这看起来有点hacky并且将Integer的范围扩展到我的可观察链之外。

1 个答案:

答案 0 :(得分:1)

此用例有一个专门的flatMap

http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Observable.html#flatMap(io.reactivex.functions.Function,%20io.reactivex.functions.BiFunction)

第二个参数将flatmap的结果与导致它们发出的项目组合在一起。

所以更新的例子是

public void main() {
    Observable.fromIterable(Arrays.asList(1, 2, 3, 4, 5))
            .flatMap(id -> getEvenOdd(id),
                    (BiFunction<Integer, String, String>) (integer, string) -> { // LOOK HERE
                        return string + Integer.toString(integer);
                    })
            .map(joinedStringAndInt -> {
                ... use joinedStringAndInt
            });
}

BiFunction中的第三种类型是组合值的类型。在这里,我只选择将String和Integer组合成另一个String

作为旁注,如果您认为同一Observable的多个实例可以访问doOnNext变量,那么intCache解决方案会很糟糕并且不安全。