一、背景
一个需求的技术点,需要循环删除 List 中的元素
二、实现
怎么删除 List 中姓李的人?
public List<String> initList = Arrays.asList("张三", "李四", "周一", "刘四", "李强", "李白");
1、普通 for 循环删除(不可靠)
点击查看代码
@Test
public void remove1() {
List<String> list = new ArrayList(initList);
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if (str.startsWith("李")) {
list.remove(i);
}
}
System.out.println(list);
}
输出结果:
[张三, 周一, 刘四, 李白]
2、普通 for 循环提取变量删除(抛异常)
点击查看代码
@Test
public void remove2() {
List<String> list = new ArrayList(initList);
int size = list.size();
for (int i = 0; i < size; i++) {
String str = list.get(i);
if (str.startsWith("李")) {
list.remove(i);
}
}
System.out.println(list);
}
输出结果:
因为 size 变量是固定的,但 list 的实际大小是不断减小的,而 i 的大小是不断累加的,一旦 i >= list 的实际大小肯定就异常了。
3、普通 for 循环倒序删除(可靠)
点击查看代码
@Test
public void remove3() {
List<String> list = new ArrayList(initList);
for (int i = list.size() - 1; i > 0; i--) {
String str = list.get(i);
if (str.startsWith("李")) {
list.remove(i);
}
}
System.out.println(list);
}
输出结果:
[张三, 周一, 刘四]
4、增强 for 循环删除(抛异常)
点击查看代码
@Test
public void remove3() {
List<String> list = new ArrayList(initList);
for (String element : list) {
if (element.startsWith("李")) {
list.remove(element);
}
}
System.out.println(list);
}
输出结果:
5、迭代器循环迭代器删除(可靠)
点击查看代码
@Test
public void remove4() {
List<String> list = new ArrayList(initList);
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
String str = iterator.next();
if (str.contains("李")) {
iterator.remove();
}
}
System.out.println(list);
}
输出结果:
[张三, 周一, 刘四]
6、迭代器循环集合删除(抛异常)
点击查看代码
@Test
public void remove5() {
List<String> list = new ArrayList(initList);
for (Iterator<String> ite = list.iterator(); ite.hasNext(); ) {
String str = ite.next();
if (str.contains("李")) {
list.remove(str);
}
}
System.out.println(list);
}
7、集合 forEach 方法循环删除(抛异常)
点击查看代码
@Test
public void remove6() {
List<String> list = new ArrayList(initList);
list.forEach((e) -> {
if (e.contains("李")) {
list.remove(e);
}
});
System.out.println(list);
}
8、stream filter 过滤(可靠)
点击查看代码
@Test
public void remove7() {
List<String> list = new ArrayList(initList);
list = list.stream().filter(e -> !e.startsWith("李")).collect(Collectors.toList());
System.out.println(list);
}
输出结果:
[张三, 周一, 刘四]
三、遇到的报错
无