我不确定如何确定标题,但这就是情况。我有2个列表,DBList
是DB值列表,NewList
是要存储在DB中的新值列表。现在最棘手的部分是我只添加了不存在的DBList
值,但如果DBList
包含的值NewList
不是我想要的话删除它们
基本上,NewList
变为DBList
,但我想保留DBList
中已保留到数据库的所有适用的以前存在的数据
这就是我所拥有的并且有效,但我想知道是否有更好的方法。
List<DeptMajors> DBList;
List<DeptMajors> NewList;
for(DeptMajors dm : NewList) {
if(!DBList.contains(dm)) {
DBList.add(dm);
}
}
Iterator<DeptMajors> i = DBList.iterator();
while(i.hasNext()) {
DeptMajors dm = i.next();
if(!NewList.contains(dm)) {
i.remove()
}
}
因此,第一个循环会将NewList
中的所有数据都放入DBList
中,而这些数据并不存在。然后,下一个循环将检查DBList
是否包含NewList
中不存在的数据,并将其从DBList
答案 0 :(得分:2)
好的,所以我不得不补课DeptMajors
:
import groovy.transform.*
@TupleConstructor
@ToString(includeNames=true)
@EqualsAndHashCode(includes=['id'])
class DeptMajors {
int id
String name
int age
}
如果id
匹配(并且没有其他字段)
然后我们可以创建一个dbList
(变量的小写初始char,否则Groovy有时会感到困惑并认为它是一个类)
def dbList = [
new DeptMajors(1, 'tim', 21),
new DeptMajors(2, 'raymond', 20)
]
并且newList
包含更新的raymond
(将被忽略),新条目alice
(将被添加)而不包含tim
(以便将被删除)
def newList = [
new DeptMajors(2, 'raymond', 30),
new DeptMajors(3, 'alice', 28)
]
然后我们可以计算出新的合并列表。这是dbList
和newList
的交集(因此我们将raymond
保持在原始状态),添加到newList
中的新元素,可以通过{dbList
找到1}}远离它:
def mergedList = dbList.intersect(newList) + (newList - dbList)
这给出了我认为你想要的结果?
assert mergedList == [
new DeptMajors(2, 'raymond', 20), // unchanged
new DeptMajors(3, 'alice', 28) // new entry (tim is removed)
]
或者正如BZ在评论中所说,你也可以使用:
def mergedList = newList.collect { e -> dbList.contains(e) ? dbList.find { it == e }: e}
或更短的:
def mergedList = newList.collect { e -> dbList.find { it == e } ?: e}