假设我有这种可观察的情况:
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的范围扩展到我的可观察链之外。
答案 0 :(得分:1)
此用例有一个专门的flatMap
:
第二个参数将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
解决方案会很糟糕并且不安全。