
本文介绍如何利用 Java 8 Stream API 和 List.contains() 方法,高效筛选出 Person 列表中年龄属于给定年龄集合的元素,并给出完整可运行示例及关键注意事项。
本文介绍如何利用 java 8 stream api 和 `list.contains()` 方法,高效筛选出 `person` 列表中年龄属于给定年龄集合的元素,并给出完整可运行示例及关键注意事项。
在 Java 开发中,常需根据外部条件列表(如一组目标年龄)对对象集合进行过滤。核心思路是:将待匹配的值(如 ages)构建成一个查找集合,再在 Stream 的 filter() 中通过 contains() 判断当前对象属性是否命中。
以下为完整、规范的实现代码:
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);
// ✅ 正确写法:使用 getter + contains()
List<person> specificAges = people.stream()
.filter(p -> ages.contains(p.getAge()))
.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 getter 方法
public Integer getAge() {
return age;
}
public String getFirstName() {
return firstName;
}
@Override
public String toString() {
return firstName + " " + age;
}
}</person></integer></person>
⚠️ 关键注意事项:
- 必须定义 getAge() 方法:原始代码中 p.age 是私有字段,无法直接访问;Stream lambda 中应调用 p.getAge()。
-
性能提示(大数据量场景):List.contains() 时间复杂度为 O(n),若 ages 列表较大(如 >1000 项),建议转为 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> -
空值安全:若 age 可能为 null,需额外判空,避免 NullPointerException:
.filter(p -> p.getAge() != null && ages.contains(p.getAge()))
该方案简洁、可读性强,是 Java 函数式编程中处理“按白名单过滤”的典型实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











