【问题标题】:Updating incoming list with existing data using operators使用运算符使用现有数据更新传入列表
【发布时间】:2022-01-18 14:06:20
【问题描述】:

我有 2 个列表

  1. 来自服务器的更新列表。
  2. 来自服务器的本地存储的列表副本

传入的服务器列表数据将替换 localList 中的数据,但在此之前,我需要将 localList 中的数据合并到incomingList,因为本地列表中的某些项目可能已被修改。

我正在按照以下方式进行操作,由于循环,它看起来像 Java。有没有 Kotlin 的方法?

val localList = List<Animal> ...
fun onIncomingData(incomingList : List<Animal>) {

    val mutableList = incomingList.toMutableList()
    
    mutableList.forEachIndex{ index, freshItem ->
       localList.forEach { localItem ->
          if(localItem is Cat && localItem.id == freshItem.id) {
             mutableList[index] = freshItem.copy(value1 = localItem.value1, value2 = localItem.value2)
            return@forEach
          }
       }
    }
}

【问题讨论】:

  • 我正在尝试学习运算符,但我通常很难弄清楚是否有一种方法可以使用我正在使用循环的 kotlin 集合运算符来实现某些目标。因此问题
  • 您说您希望传入的列表数据替换本地数据 - 那么为什么要将本地数据复制到传入数据?只需从传入列表中删除您不想替换本地列表的相关项目。
  • @k314159 来自服务器的数据是更新的数据,但是模型对象中有一些本地数据需要复制到与传入列表的 id 匹配的项目中

标签: java kotlin collections operators


【解决方案1】:

代替内部的 forEach 循环,使用:

localList.find {it is Cat && it.id == freshItem.id}?.let {
    mutableList[index] = freshItem.copy(value1 = it.value1, value2 = it.value2)
}

另外,我假设你的真实代码会对你创建的可变列表做一些事情。

【讨论】:

  • 感谢您的建议。我无权访问 let 块中的 Cat 类型。
  • @user2498079 你总是可以投射它。我假设您的意思是 value1 和 value2 是特定于 Cat 的。那么你可以做(it as Cat).value1(it as Cat).value2
  • 是的,这是真的。我正在尝试了解是否有另一种方法可以获取 let 块中的实际类型,因为我们正在检查 find 块中的 Cat 类型
  • @user2498079 或许可以试试localList.find {it is Cat &amp;&amp; it.id == freshItem.id} as? Cat?.let ...
【解决方案2】:

您可以只映射传入列表并保留一些元素同时替换其他元素,而不是替换可变列表中的元素,如下所示:

val resultList = incomingList.map{ freshItem ->
    val existing = localList.find { it is Cat && it.id == freshItem.id } as Cat?
    if(existing != null) freshItem.copy(value1 = existing.value1, value2 = existing.value2) else freshItem
}

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 2021-05-14
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2018-07-30
    • 2023-03-02
    • 2015-05-05
    • 2014-07-24
    相关资源
    最近更新 更多