java - RxJava 比较来自两个可观察对象的不同项目 (java 7)

标签 java rx-java contains

我有两个发出 items 的 Observables ob1 和 ob2。如果 ob1.item 包含在 ob2 中,我想忽略它。

示例:

ob1 contains A,B,C,D

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

输出:

ob contains A,D

最好的表达方式是什么?

最佳答案

有一个contains返回 Observable<Boolean> 的运算符observable 是否包含给定元素。

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

您需要映射observable1 中的所有元素那些 boolean 可观察量

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

这会给你 Observable<Observable<Boolean>> ,但是很难处理这个。因此,您将所有这些 boolean 可观察值连接成一个。幸运的是,您需要做的就是使用 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 中的 boolean 值包含在 observable2

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

您可以轻松地 zip这两个 observable 变成一个 observable,它将传递未包含在 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);
    }
});

关于java - RxJava 比较来自两个可观察对象的不同项目 (java 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43328019/

相关文章:

java - java中获取文件的路径

c# - ReSharper 5.x、HashSet Contains() 和 "Possible ' null' 赋值”

Java线程死锁问题

java - Spring Boot 找不到 JdbcTemplate 的数据源

java - 我们可以在客户端获取小程序代码吗

java - 每个 Java Future 在其生命周期中控制一个核心

java - 具有最后状态的 RxJava Observable

java - rxjava中的后台任务队列

javascript - 在 JavaScript 中实现 `[1,2].contains(2)`

c# - 如何检查一个列表是否包含另一个列表的所有元素