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