使用运算符使用现有数据更新传入列表
Updating incoming list with existing data using operators
我有 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
}
}
}
}
代替内部 forEach 循环,使用:
localList.find {it is Cat && it.id == freshItem.id}?.let {
mutableList[index] = freshItem.copy(value1 = it.value1, value2 = it.value2)
}
此外,我假设您的真实代码会对您创建的可变列表执行某些操作。
除了替换可变列表中的元素之外,您还可以映射传入列表并在替换其他元素的同时保留一些元素,如下所示:
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
}
我有 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
}
}
}
}
代替内部 forEach 循环,使用:
localList.find {it is Cat && it.id == freshItem.id}?.let {
mutableList[index] = freshItem.copy(value1 = it.value1, value2 = it.value2)
}
此外,我假设您的真实代码会对您创建的可变列表执行某些操作。
除了替换可变列表中的元素之外,您还可以映射传入列表并在替换其他元素的同时保留一些元素,如下所示:
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
}