Java 8中嵌套的forEach抛出异常[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 8中嵌套的forEach抛出异常[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

编辑它的工作

        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

答案

它就是这么说的。在循环中,您正在修改正在循环的数组,这在Java foreach循环中是不允许的。

我建议您在外部foreach循环中创建一个临时数组(用户循环用户)以获取权限,并从该数组中删除项目,而不是用户的权限数组。因此,你应该使用像user.removePrivilege(privilege);这样的东西而不是temp.remove(privilege)

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

以上是关于Java 8中嵌套的forEach抛出异常[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从lambda抛出异常[重复]

从lambda抛出异常[重复]

嵌套的 foreach 循环使用 if 条件创建重复记录 - PHP Laravel 8

Java多层嵌套异常处理的基本流程

构造函数抛出异常嵌套异常是 java.lang.nullpointerexception

构造函数抛出异常;嵌套异常是 java.lang.NoSuchMethodError: org.springframework.util.AntPathMatcher.setCaseSensitive