// 此方法会报错详情请查看 “浅析ConcurrentModificationException异常的原因”文章 不能在foreach表达式中移除
private static void test1(){
List<Long> list = Lists.newArrayList(1L,2L,3L,4L,5L,6L,7L,8L);
for(Long item:list){
if(item == 2L){
list.remove(item);
}
System.out.println(item);
}
}
// 场景 for循环中处理逻辑和删除元素
// 此方法不会报错 但是会导致循环数据丢失
private static void test2(){
List<Long> list = Lists.newArrayList(1L,2L,3L,4L,5L,6L,7L,8L);
for(int i =0;i<list.size();i++){
if(list.get(i) == 2L){
// 此方法会导致 3L数据丢失循环,因为当前i = 1移除后i没变但是list变成了
// (1L,3L,4L,5L,6L,7L,8L) 下次循环 i++ 变成了 2 ,i=2对应的是4L此时就会丢失
list.remove(i);
continue;
}
System.out.println(list.get(i));
}
}
// 此方法可以做到正确处理业务逻辑且删除元素
private static void test3(){
List<Long> list = Lists.newArrayList(1L,2L,3L,4L,5L,6L,7L,8L);
for(int i =0;i<list.size();i++){
if(list.get(i) == 2L){
list.remove(i);
i--;
continue;
}
System.out.println(list.get(i));
}
}
// 最好的处理方式 需要处理逻辑和删除元素的场景使用迭代器
private static void test4(){
List<Long> list = Lists.newArrayList(1L,2L,3L,4L,5L,6L,7L,8L);
Iterator<Long> it = list.iterator();
while(it.hasNext()){
long next = it.next();
if(next == 2L){
it.remove();
continue;
}
System.out.println(next);
}
}
// 但是迭代器也有无法处理的场景,因为迭代器一次循环性只能删除一个元素,如果需要一次循环删除
// 多个元素时则不支持,此时还是得使用for循环
private static void test5(){
List<String> list = Lists.newArrayList("1","2","3","*","4","5","*");
for (int i = 3; i < list.size(); i++) {
String express = list.get(i);
if (express.equals("*")) {
String pre = list.get(i - 1);
String prePre = list.get(i - 2);
String prePrePre = list.get(i - 3);
BigDecimal result = new BigDecimal(pre);
result = result.multiply(new BigDecimal(prePre)).multiply(new BigDecimal(prePrePre));
list.set(i - 3, result.toString());
// 清除计算的两个元素
list.remove(i - 2);
list.remove(i - 2);
list.remove(i - 2);
// 复原下标
i--;
}
}
System.out.println(list.get(0));
}
For循环处理删除元素时优雅方式
最新推荐文章于 2022-07-07 10:59:29 发布