Rxjava过滤List中的重复项

时间:2017-07-28 08:30:52

标签: android database retrofit2 rx-java2

我在我的应用程序中使用RxJava和Retrofit。这是应用程序的设置。当应用程序启动时,应用程序向数据库和网络Api(使用Retrofit)发出两个请求,并且两个请求都返回{ {1}}。所以我所做的基本上是合并了两个Observable。现在问题是网络有时返回已存在于数据库中的文章。那么如何从List中过滤掉重复的项目。这是我的代码。

Observable<List<Article>>

所以我尝试了不同的运算符,但它没有过滤掉这些文章。这里的输出看起来像是db。

return Observable.merge(dataSource.getArticles(source), remoteSource.getArticles(source))
            .distinct();

网络输出

Article1
Article2
Article3
Article4

我想要的是一个独特的文章列表

2 个答案:

答案 0 :(得分:2)

假设您的require_once(__DIR__.'/../../vendor/symfony/phpunit-bridge/bin/.phpunit/phpunit-5.7/vendor/autoload.php'); require_once(__DIR__.'/../../vendor/symfony/phpunit-bridge/bin/.phpunit/phpunit-5.7/src/Framework/Assert/Functions.php'); 具有正确的Article实施,

你可以将它们收集到一个集合中:

equals

或者您可以展开每个列表并应用 dataSource.getArticles(source) .mergeWith(remoteSource.getArticles(source)) .collect(HashSet::new, (set, list) -> set.addAll(list)) ,然后应用distinct

toList

答案 1 :(得分:0)

那是因为他们正在返回不同的列表。因此distinct方法将它们识别为不同的项目

如果你想首先发出数据库项,然后添加服务器项...这可能有点复杂,但不是太多;)

Observable<List<Article>> databaseArticles = ...
Observable<List<Article>> serverArticles = ...
Observable<List<Article>> allArticles =
    Observable.combineLatest(
        databaseArticles,
        serverArticles
            .startWith(emptyList()),         // so it doesn't have to wait until server response
        (dbItems, sItems) => {
            // Combine both lists without duplicates
            // e.g.
            Set<Article> all = new HashSet<>();
            Collections.addAll(all, dbItems);
            Collections.addAll(all, sItems);
            return new ArrayList<>(all);
        });