stream流过滤对象属性包含某个值
时间: 2025-06-23 12:28:37 浏览: 18
### Java Stream API 过滤对象属性包含特定值
为了展示如何使用Java Stream API根据对象属性包含的特定值进行过滤,下面通过一个具体的例子说明这一过程。
假设存在`Person`类,其中包含`name`和`age`两个字段。目标是从一组`Person`对象中筛选出年龄大于等于18岁的成年人:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 17));
people.add(new Person("Charlie", 30));
// 使用Stream API过滤成人
List<String> adultNames = people.stream()
.filter(p -> p.getAge() >= 18) // 只保留成年个体
.map(Person::getName) // 提取名字
.collect(Collectors.toList()); // 收集结果到列表
System.out.println(adultNames);
}
}
```
上述代码创建了一个名为`people`的人群列表,并利用`.stream()`方法将其转化为流形式。接着调用了`.filter()`函数并传入lambda表达式作为参数,此表达式的逻辑是只允许那些满足给定条件——即年龄不小于18岁的人物进入下一步处理流程。之后再经过映射操作提取这些人的姓名,最终收集至新的字符串类型的列表之中[^1]。
对于更复杂的情况,比如当需要基于可选类型(如`Optional<Filter>`)或其他嵌套结构内的成员变量来进行过滤时,同样可以通过组合不同的中间操作符达成目的。例如,在查询报告(`Report`)内含有若干个查询项(`Query`)的情况下,想要获取所有具备指定比较过滤器(`comparisonFilter`)的对象实例,则可以编写如下所示的语句片段:
```java
// 假设已有report对象...
List<Query> filteredQueries = report.getQueries().stream()
.filter(q -> q.getComparisonFilter().isPresent())
.filter(q -> q.getComparisonFilter().get().equals(targetFilter))
.collect(Collectors.toList());
```
这里先是对原始集合执行一次初步筛除动作,排除掉任何未设置有效`comparisonFilter`的数据条目;紧接着再次运用`.filter()`进一步缩小范围直至仅留下匹配预期标准的结果为止[^5]。
阅读全文
相关推荐


















