避免在Java 8中避免ConcurrentModificationException的最佳方法是什么

时间:2019-03-22 09:39:30

标签: java java-8

我有下面的代码返回了ConcurrentModificationException。我可以看到一些在java7中处理相同问题的方法。相反,在Java 8中处理相同内容的最佳方法是什么

List<String> mylist = new ArrayList<>();
        mylist.add("test");

        mylist.forEach(str -> {
            if(str.equalsIgnoreCase("test"))
            {
                mylist.add("pass");
            }
        });

1 个答案:

答案 0 :(得分:0)

我想说,避免这种情况的最好方法是避免在迭代过程中操纵集合。

你可以

if (myList.stream()
      .filter(s -> "test".equalsIgnoreCase(s))
      .findFirst()
      .isPresent()) {
    myList.add("pass");
}

或更简单,如Ole指出的

if (myList.stream()
          .anyMatch("test"::equalsIgnoreCase)) {
    myList.add("pass");
}

编辑: 糟糕,纳曼是对的,您想添加与匹配项一样多的“通行证”,所以

long matches = list.stream()
                   .filter("test"::equalsIgnoreCase)
                   .collect(Collectors.counting());
for (long i = 0; i < matches; i++) {
    list.add("pass");
}