Java 8中的嵌套forEach引发异常

时间:2019-02-26 08:26:54

标签: java java-8

编辑 它的工作

        group.getUsers().forEach(user -> {
        user.removeGroup(group);
        privilegeRepository.findAll().stream().
                filter(privilege -> privilege.getName().startsWith(slugname.toUpperCase()))
                .forEach(privilege -> {
            user.removePrivilege(privilege);
            privilegeRepository.delete(privilege);
        });
    });

我嵌套了for循环,我想用forEach替换该for循环:

for (User user : group.getUsers()) {
     user.removeGroup(group);

     for(Privilege privilege : user.getPrivileges()){

         if (privilege.getName().startsWith(slugname.toUpperCase())){
             user.removePrivilege(privilege);
             privilegeRepository.delete(privilege);
         }
     }
}

group.getUsers().forEach(user -> {

     user.removeGroup(group);

     user.getPrivileges().stream().filter(privilege -> privilege.getName().startsWith(slugname.toUpperCase()))
          .forEach(privilege -> {
              user.removePrivilege(privilege);
              privilegeRepository.delete(privilege);
          });
});

它会引发异常:

  

java.util.ConcurrentModificationException

1 个答案:

答案 0 :(得分:0)

这就是它的意思。在循环中,您正在修改要遍历的数组,这在Java foreach循环中是不允许的。

我建议您在外部foreach循环(在其中循环用户)中为特权创建一个临时数组,然后从该数组中删除项目,而不是从用户的特权数组中删除。因此,您应该使用user.removePrivilege(privilege);之类的字词代替temp.remove(privilege)

在内循环之后,您可以清除用户的特权数组并将项目添加到临时数组中。