我有两个列表,一个来自本地DB,另一个来自JSON云查询。问题是由于遗留代码,云中的设备必须映射到存储在DB上的本地类型。(这个客户不是我做的)。因此,在某个时候,我们添加了一个新的对象,它总是来自本地。由于时间问题和我们现在无法触及的糟糕的RXJava编程,我们想要检查它是否存储在云中。如果不是,那么我们将该对象添加到云对象列表中,并发送更新。我们必须发送整个名单,而不仅仅是新的,再次客户决定的那一个。所以这里有一个更干净的方法,我尝试过使用过滤器,filterNot,但是这似乎适用于所有的测试用例:
val tempList = convertLocalObjectToCloud(Id, localObjectsList)
val differences: MutableList<CloudObject> = mutableListOf()
tempList.forEach {localObject->
val found = cloudList.find {
localObject.Id == it.Id
}
if (found == null) {
differences.add(localObject)
}
}
// add to list only items not found
cloudList += differences
必须对所有七个测试用例都有效,
H 110
本地列表中的所有设备的项目比云多- cloudList只向其列表中添加了这些项<代码>H 211<代码>H 112云列表中有更多的项目,但是在云中重复的项目更少,但是在云中重复的所有更改(稍后删除)<代码>H 213<代码>H 114云和本地列表中有不同的大小,一些来自本地的项目在云中丢失,一些来自本地的云丢失-cloudList只添加那些稍后会出现的本地has...delete的缺失。
我用函数代码的要点编写了一个快速的JUnit测试用例。
class AddFromLocalDBToCloudTest {
val localList: MutableList<Quijibo> = mutableListOf()
val cloudList: MutableList<Quijibo> = mutableListOf()
fun FindMissingObjects() {
val differences: MutableList<Quijibo> = mutableListOf()
localList.forEach { localObject->
val found = cloudList.find {
localObject.Id == it.Id
}
if (found == null) {
differences.add(localObject)
}
}
// add to list only items not found
cloudList += differences
}
@Before
fun setup() {
localList.add(Quijibo(1, "name 1"))
localList.add(Quijibo(2, "name 2"))
localList.add(Quijibo(3, "name 3"))
localList.add(Quijibo(4, "name 4"))
cloudList.add(Quijibo(1, "name 1"))
cloudList.add(Quijibo(2, "name 2"))
cloudList.add(Quijibo(4, "name 4"))
}
@Test
fun `1 Added Missing in Cloud`() {
FindMissingObjects()
assertEquals(4, cloudList.size)
}
@Test
fun `2 Same in Cloud`() {
cloudList.add(Quijibo(3, "name 3"))
FindMissingObjects()
assertEquals(4, cloudList.size)
}
@Test
fun `3 Empty in Local DB`() {
localList.clear()
FindMissingObjects()
assertEquals(3, cloudList.size)
}
@Test
fun `4 Empty in both Lists`() {
localList.clear()
cloudList.clear()
FindMissingObjects()
assertEquals(0, cloudList.size)
}
@Test
fun `5 Empty in Cloud`() {
cloudList.clear()
FindMissingObjects()
assertEquals(4, cloudList.size)
}
@Test
fun `6 More in Cloud but slightly different in both`() { // could happen...edge case
localList.removeAt(3)
localList.removeAt(0)
FindMissingObjects()
assertEquals(4, cloudList.size)
}
}
data class Quijibo(var Id: Int, var name: String)
发布于 2020-10-01 16:31:56
您可以通过使用filter
来做到这一点。下面的代码只保存来自tempList
的元素,对于这些元素,cloudList
的所有元素都有不同的id,即,已经不在cloudList
中的元素,然后将这些元素添加到cloudList
中。
cloudList += tempList.filter{ localObject ->
cloudList.all{ it.id != localObject.id }
}
https://stackoverflow.com/questions/64144913
复制相似问题