我有一个DTO,其中包含一个列表,我添加或删除了一些项目,在我的DAO中获取此列表时,我想将其与现有的项目进行比较,因此所有新项目都不存在于将添加旧列表,并且将删除旧列表中dto列表中不存在的项目。 例如,这是列表中已存在的项目:
[a,b,c]
dto中的列表包含:
[b,d]
因此,在这种情况下,[d]
将被插入,[a]
和[c]
将被删除。
有一种方法我可以删除旧列表,然后添加DTO列表中的所有元素,但我不希望这样。
这就是我的尝试:
public Role updateRoleDTO(final RoleDTO roleDTO) {
//...
//... Some code
//...
boolean profilExist = false;
RoleProfil roleProfil = null;
// Add non existing profils
for (Profil profil : roleDTO.getProfils()) {
profilExist = false;
roleProfil = new RoleProfil();
for(Profil oldProfil : oldProfilsList){
if(profil.getId().equals(oldProfil.getId())){
profilExist = true;
break;
}
}
if(!profilExist){
roleProfil.setRoleId(insertedRole);
roleProfil.setProfilId(profil);
roleProfilDAO.insert(roleProfil);
}
}
//Remove existing profils that are not in the updated Role
for(Profil oldProfil : oldProfilsList){
profilExist = false;
for (Profil profil : roleDTO.getProfils()) {
if(oldProfil.getId().equals(profil.getId())){
profilExist = true;
break;
}
}
if(!profilExist){
roleProfilDAO.delete(roleProfilDAO.findRoleProfilByRoleIdAndProfilId(roleDTO.getRoleId(), oldProfil.getId()));
}
}
所以我第一次查看旧列表中是否包含DTO列表中的项目,如果不包含,我将添加它。 在第二次,我将查看DTO列表中是否包含旧列表中的项目,如果不包含,我将删除它。
在这种方法中,我创建了两个循环,每个循环包含一个内部循环,看起来太长了。
我能做到吗?或使用Java 8流,这将使它看起来更好?
答案 0 :(得分:1)
如果你可以将数据结构重新建模为一个Set(并且因为你通过id进行比较,你似乎可以通过让Profil的hashCode / equals这样做),你可以使用Guava {{{{{{ 3}} class:
Set<String> oldSet = Sets.newHashSet("a", "b", "c");
Set<String> newSet = Sets.newHashSet("b", "d");
Sets.SetView<String> toRemove = Sets.difference(oldSet, newSet);
Sets.SetView<String> toInsert = Sets.difference(newSet, oldSet);
Sets.SetView<String> toUpdate = Sets.intersection(oldSet, newSet);
或使用Java 8的Streams API:
Set<String> oldSet = new HashSet<>(Arrays.asList("a", "b", "c"));
Set<String> newSet = new HashSet<>(Arrays.asList("b", "d"));
Stream<String> toRemove = oldSet.stream().filter(e -> !newSet.contains(e));
Stream<String> toInsert = newSet.stream().filter(e -> !oldSet.contains(e));
Stream<String> toUpdate = oldSet.stream().filter(newSet::contains);
答案 1 :(得分:0)
oldProfilsList.addAll(roleDTO.getProfils());
oldProfilsList.removeIf(op ->!roleDTO.getProfils().contain(oldProfile));
oldProfilsList = new ArrayList<Profile>(new HashSet<Profile>(oldProfilsList))
oldProfilsList将根据需要为您提供列表。