在我的项目中,我使用了两次removeAll方法。在第二次,我必须使用列表的副本,因为首先使用removeAll方法修改源列表。如果没有复制清单,有没有办法做到这一点?
val apiIdListCopy: MutableList<Int> = apiIdList
apiIdList.removeAll(dbIdList)
dbIdList.removeAll(apiIdListCopy)
编辑: 对于未来的观众,我在Kotlin中找到了更简单的解决方案
val api: List<Int> = apiIdList.stream().filter{item -> !dbIdList.contains(item)}.collect(Collectors.toList())
val db: List<Int> = dbIdList.stream().filter{item -> !apiIdList.contains(item)}.collect(Collectors.toList())
答案 0 :(得分:1)
Kotlin已经提供了您所需要的一切:
val onlyInApi = apiIdList - dbIdList
val onlyInDb = dbIdList - apiIdList
-
运算符适用于Iterable
,因此您可以将其应用于列表或集合。请注意,它使用了引擎盖,因此它与使用Guava的Sets.difference
一样高效。
答案 1 :(得分:-1)
在我看来,你真正想要实现的是在这两个列表之间找到差异。除非列表非常短,否则您尝试这样做的方式极其低效,因为删除时会有n ^ 2的复杂性。
我的建议是使用Set而不是List,然后使用guava Sets方法:
SetView<Integer> onlyInApi = Sets.difference(apiIdSet, dbIdSet);
SetView<Integer> onlyInDb = Sets.difference(dbIdSet,apiIdSet);
这样,您创建的集合包含您感兴趣的两个集合之间的差异,但实际上没有复制(因为它们是视图并且仍然由原始集合支持)。
以上示例是java,而不是kotlin,但转换应该是微不足道的。