java.util.ConcurrentModificationException的报错和常见循环方法的归类
问题引入
代码本身没有问题,但是由于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);
还没有评论,来说两句吧...