java.util.ConcurrentModificationException的报错和常见循环方法的归类

文章介绍了在Java中不能在forEach循环中直接删除List元素的原因,推荐使用StreamAPI的filter方法来实现同样的效果。提供了多个Stream操作的例子,如过滤、映射、收集、去重等,并展示了如何将List转换为Map。此外,还对比了传统for循环和StreamAPI的使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题引入

代码本身没有问题,但是由于forEach本质就是增强的for循环(增强for循环也同理会报错),底层即迭代器,list.remove就会出异常。

当然还有一种思路就是利用Stream的刷选功能,快速过滤所需要的元素,虽然没有对集合删除元素,但同样达到了目的,并且写法更加简洁。

public void Match(){
        // 删除List中姓李的人
        List<String> initList = Arrays.asList("张三", "李四", "王五", "李白");
        List<String> list = new ArrayList(initList);
        list = list.stream().filter(
                e->!e.startsWith("李")
        ).collect(Collectors.toList());
            System.out.println(list);
    }

List.stream()常用的操作

        //单条件过滤
        list.stream().filter(e -> e.contains("张")).forEach(System.out::println);

        //多条件过滤
        list.stream().filter(a->a.equals("赵四")).filter(a->a.contains("赵")).forEach(System.out::println);
      
        //获取前三个元素
        list.stream().limit(3).forEach(System.out::println);
   
        //跳过前三个元素
        list.stream().skip(3).forEach(System.out::println);
    
        //跳过前三个  获取前两个
        list.stream().skip(3).limit(2).forEach(System.out::println);
    
        //去重
        list.stream().distinct().forEach(System.out::println);
   

(1) list.stream().map().collect()方法,可以获取list中JavaBean的某个字段,转成一个新的list。

(2) list.stream().filter().map().collect()方法,可以对list中的JavaBean进行筛选,保留符合条件的JavaBean,然后将JavaBean中的某个字段,转成一个新的list。

(3) list.stream().collect()方法,可以把list转为map,可以指定list的中的JavaBean的某个字段或JavaBean本身为map的key或value。(或者根据情况自定义map的key与value)

(4) list.stream().filter().collect()方法,可以先筛选出list中符合条件的JavaBean,然后把list转为map,可以指定list的中的JavaBean的某个字段或JavaBean本身为map的key或value。(或者根据情况自定义map的key与value)

        books.stream().forEach(b->{
            System.out.println(b.getName());});

        for (MongoBook b : books) {
            System.out.println(b.getName());
        }

        for (int i = 0; i < books.size(); i++) {
            System.out.println(books.get(i).getName());
        }

        books.forEach(b -> {
            System.out.println(b.getName());
        });

List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");
        boolean b = strings.stream().anyMatch(s -> "abc".equals(s));
        System.out.println(b);
//相同含义代码表达,不过下面的代码显得啰嗦一些
        boolean b1 =false;
        for(String s : strings){
            if("abc".equals(s)){
                b1=true;
            }
        }
        System.out.println(b1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值