RxJava compare different elements from two observables (java 7)

I have two Observables ob1 and ob2 that emit elements. If ob1.item is contained in ob2, I want to ignore it.

Example:

ob1 contains A,B,C,D

ob2 contains E,C,B,G,J,O

conclusion:

ob contains A,D

What is the best way to express this?

+4
source share
2 answers

There is a contains statement that returns Observable<Boolean>whether the given element contains an observable.

Observable<Boolean> contains = observable2.contains(string);

You need to map all elements from observable1to these logical observables

observable1.map(new Func1<String, Observable<Boolean>>() {
    @Override
    public Observable<Boolean> call(final String string) {
        return observable2.contains(string);
    }
})

Observable<Observable<Boolean>>, . . Luckilly, , , concatMap map

observable1.concatMap(new Func1<String, Observable<Boolean>>() {
    @Override
    public Observable<Boolean> call(final String string) {
        return observable2.contains(string);
    }
})

observable1, Observable<Boolean>, , observable1 observable2

observable1:            A ---- B ---- C ---- D
concatMapObservable:    false  true   true   false

zip , , observable2,

[concatMapObservable].zipWith(observable1, new Func2<Boolean, String, String>() {
    @Override
    public String call(final Boolean contains, final String string) {
        return contains ? "" : string;
    }
}

[zippedObservable].filter(new Func1<String, Boolean>() {
    @Override
    public Boolean call(final String string) {
        return !TextUtils.isEmpty(string);
    }
})

:

Observable<String> observable1 = Observable.from(new String[]{"A", "B", "C", "D"});
Observable<String> observable2 = Observable.from(new String[]{"E", "C", "B", "G", "J", "O"});

observable1.concatMap(new Func1<String, Observable<Boolean>>() {
    @Override
    public Observable<Boolean> call(final String string) {
        return observable2.contains(string);
    }
}).zipWith(observable1, new Func2<Boolean, String, String>() {
    @Override
    public String call(final Boolean contains, final String string) {
        return contains ? "" : string;
    }
}).filter(new Func1<String, Boolean>() {
    @Override
    public Boolean call(final String string) {
        return !TextUtils.isEmpty(string);
    }
}).subscribe(new Action1<String>() {
    @Override
    public void call(final String string) {
        Log.d("observable:", string);
    }
});
+4

, ob2, , ob1 ob2, , ob2. ob2, ob1.

RxJava2 .

    Observable<String> ob1 = Observable.fromArray("A", "B", "C", "D");
    Observable<String> ob2 = Observable.fromArray("E", "C", "B", "G", "J", "O");

    Observable.combineLatest(ob2.toList().toObservable(), ob1, (list, value) -> list.contains(value) ? "" : value)
            .filter(value -> !TextUtils.isEmpty(value))
            .subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(value -> Log.d("foo", "Value: " + value));
+3

Source: https://habr.com/ru/post/1674495/


All Articles