最近线上出了一个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);
以上三种方法,都没有问题,可以挑喜欢的用。