我有两个清单。第一个被调用oldList并包含旧数据,第二个被调用updateList并包含一组更新。
我想用这些规则创建一个新列表:
oldListidid中已存在更新的项目oldData,则替换它我想出了一个简单的代码:
物品.kt
data class Item (val id: String, val text: String)
Run Code Online (Sandbox Code Playgroud)
主文件
fun main() {
val oldList: List<Item> = listOf(
Item("aaa1", "aaa2"),
Item("bbb1", "bbb2"),
Item("ddd1", "ddd2"))
val updateList: List<Item> = listOf(
Item("aaa1", "aaa3"),
Item("ccc1", "ccc2"))
val resultList = oldList.toMutableList()
for (item in updateList) {
val index = oldList.indexOfFirst { it.id == item.id }
if (index < 0) {
resultList.add(item)
} else {
resultList[index] = item
}
}
println(resultList)
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我可以想象它效率低下,而且可能还有一些不错的Kotlin习惯用法。有更好的解决方案吗?
如果原始顺序无关紧要,您可以组合列表,将新值放在首位以在distinctBy调用中支持它们:
val resultList = (updateList + oldList).distinctBy(Item::id)
Run Code Online (Sandbox Code Playgroud)
如果顺序与您描述的完全一样,您可以在组合它们之前将两个列表转换为映射。当与 Maps 组合时+,第二个 Map 中的项目优先,但保留第一个 Map 的顺序。
val resultList =
(oldList.associateBy(Item::id) + updateList.associateBy(Item::id)).values.toList()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1791 次 |
| 最近记录: |