Rx Java - 将每对两个observable组合起来

时间:2017-05-07 12:29:08

标签: rx-java

假设

Observable<Integer> o1 = Observable.just(0, 1, 2);
Observable<Integer> o2 = Observable.just(2, 4, 6);

我需要构建数字的emition,这些数字来自o2,除以o1中的每个数字,但也避免除以零。

即。我需要一些运算符,生成

2 (2 / 1)
1 (2 / 2)
4 (4 / 1)
2 (4 / 2)
6 (6 / 1)
3 (6 / 1)

有什么建议吗?

伙计们,谢谢你们,你说得对!

但更深入地挖掘我的真实案例我遇到了更难的问题。请查看Rx java - difficult case

3 个答案:

答案 0 :(得分:1)

这样做(还没有在IDE中检查过,但是应该正常工作)?

Observable<Integer> o1 = Observable.just(0, 1, 2);
Observable<Integer> o2 = Observable.just(2, 4, 6);

Observable<Integer> o1nonZero = o1.filter(new Predicate<Integer>() {
    @Override
    public boolean test(Integer integer) throws Exception {
        return integer != null && integer != 0;
    }
})

o1nonZero.flatMap(new Function<Integer, Observable<Integer>>() {
    @Override
    public Observable<Integer> apply(Integer integer2) throws Exception {
        return o1.map(new Function<Integer, Integer>() {
            @Override
            public Integer apply(Integer integer1) throws Exception {
                return integer2 / integer1;
            }
        })
    }
})

答案 1 :(得分:0)

Observable<Integer> o1 = Observable.just(0, 1, 2);
Observable<Integer> o2 = Observable.just(2, 4, 6);
MathUtil.cartesianProduct(Observable.just(o2, o1))
    .filter(array -> array[1] != 0)
    .map(array -> array[0] / array[1])
    .forEach(System.out::println);

但是cartesianProduct是什么?

请参阅Cartesian Product了解其定义,并n-ary cartesian product in rxjava了解其实施情况。

答案 2 :(得分:0)

这对我有用。希望这对你也有帮助。

    Observable<Integer> num1 = Observable.just(0, 1, 2);
    Observable<Integer> num2 = Observable.just(2, 4, 6);

    num2.flatMap(
            i2 -> num1.filter(i -> i != 0)
                    .map(i1 -> i2 / i1)
    ).subscribe(
            s -> Log.v("", "result-> " + s),
            error -> error.printStackTrace()
    );