最近线上出了一个bug,竟然是List元素删除导致,这个本以为是常识,很基础的编码。可没想到还是会有新的开发同学出错。
错误的删除方式:for循环遍历集合,通过索引删除,看下面的错误❎演示:
List<String> list = new ArrayList<>(4);
list.add("a");
list.add("b");
list.add("b");
list.add("c");
for (int i = 0; i <list.size(); i++) {
if (list.get(i).equals("b")) {
list.remove(i);
}
}
System.out.println(list);
运行结果为:[a, b, c]
以上代码是想删除集合中的“b”元素,然而并没有全部删除!
正确的操作方法:
方法1:
List<String> list = new ArrayList<>(4);
list.add("a");
list.add("b");
list.add("b");
list.add("c");
Iterator<String> it = list.iterator();
while (it.hasNext()){
String s = it.next();
if (s.equals("b")){
it.remove();
}
}
System.out.println(list);
方法2: 一行搞定
List<String> list = new ArrayList<>(4);
list2.add("a");
list2.add("b");
list2.add("b");
list2.add("c");
list = list.stream().filter(f -> !f.contains("b")).toList();
System.out.println(list);
方法3:一行搞定
List<String> list = new ArrayList<>(4);
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.removeIf(s -> s.equals("b"));
System.out.println(list);
以上三种方法,都没有问题,可以挑喜欢的用。