
本文介绍如何利用 Java 8 的 Stream API 和 List.contains() 方法,高效筛选出属性值(如年龄)存在于目标集合中的对象列表。
本文介绍如何利用 java 8 的 stream api 和 `list.contains()` 方法,高效筛选出属性值(如年龄)存在于目标集合中的对象列表。
在实际开发中,我们常需根据一组预定义的键值(例如年龄、ID 或状态码)从对象集合中筛选子集。以 Person 列表为例,若希望仅保留 age 属于给定 List
✅ 正确写法:使用 contains() 进行成员校验
由于 ages 是一个 List
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
List<person> specificAges = people
.stream()
.filter(p -> ages.contains(p.getAge()))
.collect(Collectors.toList());</person>
⚠️ 注意:示例代码中 Person.age 是 private 字段,必须通过公共 getter 方法访问(如 p.getAge()),而非直接访问 p.age——否则会因封装性违反导致编译错误或 IDE 报错。
? 性能优化建议(大数据量场景)
当 ages 列表较大(如数百项以上)时,List.contains() 的时间复杂度为 O(n),整体过滤性能可能下降。此时推荐先将 ages 转换为 HashSet,将查找复杂度降至 O(1):
Set<integer> ageSet = new HashSet(ages);
List<person> specificAges = people
.stream()
.filter(p -> ageSet.contains(p.getAge()))
.collect(Collectors.toList());</person></integer>
? 完整可运行示例(含必要修正)
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Person p1 = new Person("John", 25);
Person p2 = new Person("Lisa", 54);
Person p3 = new Person("Mike", 61);
List<person> people = Arrays.asList(p1, p2, p3);
List<integer> ages = Arrays.asList(25, 54);
Set<integer> ageSet = new HashSet(ages); // 可选优化
List<person> specificAges = people
.stream()
.filter(p -> ageSet.contains(p.getAge())) // 推荐使用 Set
.collect(Collectors.toList());
System.out.println(specificAges); // 输出: [John 25, Lisa 54]
}
}
class Person {
private String firstName;
private Integer age;
public Person(String firstName, Integer age) {
this.firstName = firstName;
this.age = age;
}
public Integer getAge() { // 必须提供 getter
return age;
}
@Override
public String toString() {
return firstName + " " + age;
}
}</person></integer></integer></person>
✅ 关键要点总结
- ✅ 始终使用 getter 访问私有字段,保障封装性与代码健壮性;
- ✅ 小规模匹配列表(≤50 项)可直接用 List.contains(),简洁直观;
- ✅ 大规模或高频匹配场景,优先转为 HashSet 提升性能;
- ✅ filter() 返回的是 Stream
,务必调用 .collect(Collectors.toList()) 获取最终结果; - ❌ 避免使用 == 比较 Integer 对象(易因缓存机制导致意外结果),应统一用 .equals() 或 contains() 方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










