RxJava:合并2个列表,忽略列表2中缺少的项



我有两个对象列表,RemoteList和LocalList
当我的应用程序脱机时,远程用户可以在RemoteList中添加和删除对象,而本地用户正在编辑LocalList
当应用程序再次连接时,它应该同步这两个列表
显示如何合并列表的大理石图


例如,以下是同步前每个列表中的对象ID:
RemoteList:0,1,2(已删除(,3(新(,4

同步时,必须更改id,以防止有两个id相同的独立对象。

MergedList:0,3,4,5(本地id 3已更改为5(


我正在试验RxJava,所以快速指向正确的方向会很好。合并叉组合?也许可以像isSynced一样使用Filter并向Object添加字段?

Single<List<X>>的形式获取每个列表,其中X是指示特定项目发生了什么的记录,zip将它们放在一起。现在,您可以遍历这两个列表并同步执行组合逻辑:

record Item(int id, boolean added, boolean deleted) { }
Single<List<Item>> remoteListSource = ...
Single<List<Item>> localListSource = ...
Single.<List<Item>>zip(remoteListSource, localListSource, 
(remoteList, localList) -> {
Set<Integer> deleted = new HashSet<>();
// collect deleted ids
remoteList.stream()
.filter(item -> item.deleted)
.forEach(item -> deleted.add(item.id));
localList.stream()
.filter(item -> item.deleted)
.forEach(item -> deleted.add(item.id));
Set<Integer> duplicate = new HashSet<>();
List<Item> result = new ArrayList<>();
// go through both lists, ignoring deleted ids
Stream.concat(remoteList.stream(), localList.stream())
.filter(item -> !deleted.contains(item.id))
.forEach(item -> {
// id already seen?
if (duplicate.contains(item.id)) {
// if this is an addition, generate new item
if (item.added) {

item = new Item(Collections.max(duplicate) + 1, true, false);
duplicate.add(item.id);
result.add(item);
} else {
// else we have an unmodified item already in result
// nothing to do
}
} else {
// was not a duplicate, remember it
duplicate.add(item.id);
result.add(item);
}
});
return result;
})
.subscribe(combinedList -> { /* ... */ });

最新更新