使用Java 8检查数组中是否存在元素

时间:2017-09-15 16:11:48

标签: java arrays java-8

我有一个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流,这将使它看起来更好?

2 个答案:

答案 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将根据需要为您提供列表。