Alexey
Alexey

Reputation: 3192

Rx Java - combining each pair of two observables emitions

Suppose

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

I need to build emition of numbers, which are each number from o2 divided by each number from o1, but also avoid divide by zero.

I.e. I need some operator, producing

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

Any suggestions?

Guys, thanks for anwers, you are right!

But digging my real case deeper I had more difficult problem. Please give a look to Rx java - difficult case.

Upvotes: 0

Views: 300

Answers (3)

arungiri_10
arungiri_10

Reputation: 988

This works for me. Hope this helps you too.

    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()
    );

Upvotes: 0

Dean Xu
Dean Xu

Reputation: 4681

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);

But what is cartesianProduct?

See Cartesian Product for its definition and n-ary cartesian product in rxjava for its implementation.

Upvotes: 0

ULazdins
ULazdins

Reputation: 2025

Will this do (haven't checked in IDE, but should be working)?

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;
            }
        })
    }
})

Upvotes: 1

Related Questions