Java8在遍历凑集时删除元素问题
在最近事情中碰着了须要在遍历List时删除掉某些元素的情形,这时不能再利用之前一贯常用的fori或者增强for循环,会导致ConcurrentModificationException 非常。这时候可以利用迭代器Iterator或者Java8的removeIf办理问题,这里大略解释下两种方法的大略利用及一些把稳普通for循环直接处理该问题所涌现的情形。
大略需求如下:
java复制代码 / 将list中和字符串"1"相同的元素去除并输出去除后的list /List<String> list = new ArrayList<>(Arrays.asList("1","1","2","3","4","5"));
利用fori循环删除
java复制代码for (int i = 0; i < list.size(); i++) { if ("1".equals(list.get(i))) { list.remove(i); }}
css复制代码运行结果为:[1, 2, 3, 4, 5]
这里可以看到有一个元素 "1" 并没有被删除
如果利用增强for循环删除
java复制代码for (String a : list) { if ("1".equals(a)) { list.remove(a); }}
php复制代码运行结果为:Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)at java.util.ArrayList$Itr.next(ArrayList.java:851)at com.lingxiao.cloudlingxiaodigitalproject9107.service.impl.Demo2.main(Demo2.java:27)
通过迭代器实现
java复制代码Iterator<String> iterator = list.iterator();while (iterator.hasNext()) { if ("1".equals(iterator.next())) { iterator.remove(); }}System.out.println(list);
css复制代码运行结果为:[2, 3, 4, 5]
这里:iterator.hasNext()用来遍历,iterator.next()为元素的值,通过iterator.remove()方法去除元素
通过removeIf方法实现java复制代码list.removeIf(a -> "1".equals(a));
这里的lambda表达式可以简写
java复制代码list.removeIf("1"::equals);
这里利用 “::” 简化了lambda表达式
css复制代码运行结果依然为:[2, 3, 4, 5]
当我们在遍历凑集时须要删除元素,须要利用迭代器或者removeIf方法