概述
java集合的removeIf方法
- List集合
- 1.removeIf方法
List集合
1.removeIf方法
工作中常会遇到根据指定字段或要求过滤集合数据的问题,比如过滤集合中学生编号number中有字母的,看看哪种方法比较简单:
- 错误方法:for 循环
public static void main(String[] args) {
List<Person> list=new ArrayList<>();
list.add(new Person(1,"小红1","10001"));
list.add(new Person(2,"小红2","10002"));
list.add(new Person(3,"小红3","10003"));
list.add(new Person(4,"小红4","1000M"));
list.add(new Person(5,"小红5","1000M"));
//定义正则表达式5位数字
Pattern pattern = Pattern.compile("\d{5}");
//遍历集合
for (int i = 0; i < list.size(); i++) {
if(!pattern.matcher(list.get(i).getNumber()).matches()) {
list.remove(i);
}
}
//forEach
for (Person person : list) {
if(!pattern.matcher(person.getNumber()).matches()) {
list.remove(person);
}
}
}
结果:
4:[Person [id=1, name=小红1, number=10001], Person [id=2, name=小红2, number=10002], Person [id=3, name=小红3, number=10003], Person [id=5, name=小红5, number=1000M]]
结果是错误的,因为fore循环改变了索引,不要使用for循环去遍历集合进行操作;
List的底层结构是数组,数组的特点是删除某个元素时,后面所有元素的索引都会往前移,而此时for循环的指针是却是向下移动的,所以当要删除两个临近的元素时就会遗漏一个;
怎么解决呢 ,就是遍历的时候让指针回调,向上移,将上边的for循环改为如下:
//遍历集合
for (int i = 0; i < list.size(); i++) {
if(!pattern.matcher(list.get(i).getNumber()).matches()) {
list.remove(i);
i--;
}
}
- 普通方法:迭代器
public static void main(String[] args) {
List<Person> list=new ArrayList<>();
list.add(new Person(1,"小红1","10001"));
list.add(new Person(2,"小红2","10002"));
list.add(new Person(3,"小红3","10003"));
list.add(new Person(4,"小红4","1000M"));
list.add(new Person(5,"小红5","1000M"));
//定义正则表达式5位数字
Pattern pattern = Pattern.compile("\d{5}");
//迭代器
Iterator<Person> iterator = list.iterator();
while(iterator.hasNext()) {
Person person = iterator.next();
if(!pattern.matcher(person.getNumber()).matches()) {
iterator.remove();
}
}
}
结果:
3:[Person [id=1, name=小红1, number=10001], Person [id=2, name=小红2, number=10002], Person [id=3, name=小红3, number=10003]]
结果是正确的,使用迭代器操作;因为在List类中有个方法iterator(),此方法将返回一个iterator的实现,是List的内部类,即List的Iterator实现在List内部,其next()方法的底层及时“–”操作,指标回调,向上移动;
- removeIf+lambda方法(推荐)
public static void main(String[] args) {
List<Person> list=new ArrayList<>();
list.add(new Person(1,"小红1","10001"));
list.add(new Person(2,"小红2","10002"));
list.add(new Person(3,"小红3","10003"));
list.add(new Person(4,"小红4","1000M"));
list.add(new Person(5,"小红5","1000M"));
//定义正则表达式5位数字
Pattern pattern = Pattern.compile("\d{5}");
//removeIf+
list.removeIf(
Person -> !pattern.matcher(Person.getNumber()).matches()
);
System.out.println(list.size()+":"+list.toString());
}
结果:
3:[Person [id=1, name=小红1, number=10001], Person [id=2, name=小红2, number=10002], Person [id=3, name=小红3, number=10003]]
使用removeIf和lambda很简单实现了,而且代码很精简;
最后
以上就是俭朴棒棒糖为你收集整理的java集合的removeIf方法List集合的全部内容,希望文章能够帮你解决java集合的removeIf方法List集合所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复