如何根据 ID 合并两个对象列表?

mic*_*ckp 6 kotlin

我有两个清单。第一个被调用oldList并包含旧数据,第二个被调用updateList并包含一组更新。

我想用这些规则创建一个新列表:

  • 将所有数据从 oldList
  • 用唯一的附加所有更新 id
  • 如果id中已存在更新的项目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习惯用法。有更好的解决方案吗?

Ten*_*r04 7

如果原始顺序无关紧要,您可以组合列表,将新值放在首位以在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)