Java 集合怎么过滤
在日常开发数据处理中,我们常需要从一堆杂乱的数据里挑出符合要求的内容——比如从全班成绩单里选出及格的同学、从电商订单里筛选出还未发货的订单,这时候“过滤”就是最常用的操作。很多用Java的新手刚接触集合过滤时,容易纠结用哪种方法更简单、更高效,其实只要结合场景选对方式,过滤集合完全不用复杂操作。
新手最常用:for循环遍历过滤
刚学Java的人,最先接触的肯定是for循环。这个方法就像我们整理书包时,把符合要求的东西挑出来,好理解也不会出错。比如我们有一个装水果的集合,想把“苹果”挑出来,代码可以这么写:

`java
// 先造一个装水果的集合
List<String> fruits = List.of("苹果", "香蕉", "苹果", "橙子");
// 准备一个新集合,放过滤后的结果
List<String> filtered = new ArrayList<>();
// 遍历原集合,把符合条件的加进去
for (String fruit : fruits) {
if ("苹果".equals(fruit)) {
filtered.add(fruit);
}
}
`
这种方法的好处是灵活,哪怕是复杂的判断逻辑(比如既要苹果又要红苹果)都能写,但缺点也明显:代码偏冗长,每次都要手动创建新集合、写循环,遇到大数据量时,手动操作的效率也不高。
简化代码:Stream API一行搞定
从Java 8开始新增的Stream API,就像给过滤装了个“自动分拣机”,不用手动写循环,一行代码就能完成过滤。还是用刚才的水果例子,代码可以简化成:
`java
List<String> filtered = fruits.stream()
.filter(fruit -> "苹果".equals(fruit)) // 过滤条件
.collect(Collectors.toList()); // 把结果转成集合
`
这个“自动分拣”的逻辑很直观:stream()把集合变成“数据流”,filter()里的就是我们的筛选规则(就像“只留苹果”),最后用collect()把筛选后的结果变回集合。如果是过滤对象集合,比如从学生列表里挑出成绩及格的学生,逻辑也一样:
`java
// 学生类
class Student { String name; int score; }
List<Student> students = List.of(new Student("张三", 58), new Student("李四", 85));
// 过滤及格学生
List<Student> passStudents = students.stream()
.filter(s -> s.score >= 60)
.collect(Collectors.toList());
`
Stream API的优势是代码简洁,而且对大数据量的处理效率更高,是现在开发中最常用的过滤方式。
特殊场景:用Collection自带的方法
如果过滤需求比较简单,比如要过滤掉集合里的空元素,不用Stream,直接用集合自带的方法更方便。比如ArrayList的removeIf()方法,就像“边整理边把不符合的东西扔掉”:
`java
List<String> fruitsWithNull = new ArrayList<>(List.of("苹果", null, "香蕉", null));
// 过滤掉null元素,直接修改原集合
fruitsWithNull.removeIf(Objects::isNull);
`
这个方法的好处是不用创建新集合,直接在原集合上修改,适合内存占用敏感的场景。
实际开发中,选哪种过滤方式,核心看两个点:需求复杂度和代码可读性。如果只是简单过滤,用removeIf()或者Stream的一行代码就够;如果是复杂的判断逻辑,用for循环反而更易维护。只要掌握这几种方法,Java集合过滤就会变成很顺手的操作,不用再为“怎么挑数据”发愁。