我在我的应用程序中使用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
我想要的是一个独特的文章列表
答案 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);
});