removeAll – 修改源列表

在我的项目中,我使用了两次removeAll方法。 在第二次,我必须使用列表的副本,因为源列表通过首先使用removeAll方法进行修改。 有没有办法做到这一点,而不做副本的清单?

val apiIdListCopy: MutableList = apiIdList apiIdList.removeAll(dbIdList) dbIdList.removeAll(apiIdListCopy) 

编辑:对于未来的观众,我发现在Kotlin更容易的解决方案

 val api: List = apiIdList.stream().filter{item -> !dbIdList.contains(item)}.collect(Collectors.toList()) val db: List = dbIdList.stream().filter{item -> !apiIdList.contains(item)}.collect(Collectors.toList()) 

在我看来,你真正想要实现的是在这两个列表之间取得区别。 除非列表非常短,否则由于移除的复杂性,您尝试执行操作的方式极其低效。

我的建议是使用Set而不是List,然后使用番石榴设置方法:

 SetView onlyInApi = Sets.difference(apiIdSet, dbIdSet); SetView onlyInDb = Sets.difference(dbIdSet,apiIdSet); 

通过这种方式,您可以创建包含您感兴趣的两个集合之间差异的集合,但是实际上不需要复制(因为它们是视图,仍然受到原始集合的支持)。

上面的例子是java,而不是kotlin,但转换应该是微不足道的。

所有你需要的是Kotlin提供的:

 val onlyInApi = apiIdList - dbIdList val onlyInDb = dbIdList - apiIdList 

-运算符在Iterable ,所以可以将它应用到列表或集合。 请注意,它使用引擎盖下的集合,所以它像使用Guava的Sets.difference一样有效。