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

╰+攻爆jí腚メ 2023-09-27 15:23 76阅读 0赞

问题引入

48c3b7dc9063abe1a3a4560f1b4f37eb.png

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

4dc93cf87cd3cd5756ecc9d473eff697.png

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

43041505adc224902c458524d42af735.png

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

List.stream()常用的操作

  1. //单条件过滤
  2. list.stream().filter(e -> e.contains("张")).forEach(System.out::println);
  3. //多条件过滤
  4. list.stream().filter(a->a.equals("赵四")).filter(a->a.contains("赵")).forEach(System.out::println);
  5. //获取前三个元素
  6. list.stream().limit(3).forEach(System.out::println);
  7. //跳过前三个元素
  8. list.stream().skip(3).forEach(System.out::println);
  9. //跳过前三个 获取前两个
  10. list.stream().skip(3).limit(2).forEach(System.out::println);
  11. //去重
  12. 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)

  1. books.stream().forEach(b->{
  2. System.out.println(b.getName());});
  3. for (MongoBook b : books) {
  4. System.out.println(b.getName());
  5. }
  6. for (int i = 0; i < books.size(); i++) {
  7. System.out.println(books.get(i).getName());
  8. }
  9. books.forEach(b -> {
  10. System.out.println(b.getName());
  11. });
  12. List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl");
  13. boolean b = strings.stream().anyMatch(s -> "abc".equals(s));
  14. System.out.println(b);
  15. //相同含义代码表达,不过下面的代码显得啰嗦一些
  16. boolean b1 =false;
  17. for(String s : strings){
  18. if("abc".equals(s)){
  19. b1=true;
  20. }
  21. }
  22. System.out.println(b1);

发表评论

表情:
评论列表 (有 0 条评论,76人围观)

还没有评论,来说两句吧...

相关阅读

    相关 rabbitMQ循环

    背景 前几天在使用rabbitMQ处理队列消息的时候,发现后台一直在报错,但是MQ控制台显示,该消息一直没有被消费掉,使用断点也发现消息一直在循环处理。 原因 ...