我是靠谱客的博主 俭朴棒棒糖,最近开发中收集的这篇文章主要介绍java集合的removeIf方法List集合,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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集合所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部