使用 java.util.stream.stream 的 filter() 方法,传入一个 predicate 函数式接口实例即可过滤列表数据。具体做法是调用集合的 .stream() 方法获取流,接着链式调用 .filter(p -> p.getage() > 18) 并指定判断逻辑,最后通过 .collect(collectors.tolist()) 将结果收集为新的列表。该操作不会修改原列表,而是返回包含符合条件元素的新列表。

如何对自定义对象列表进行多条件过滤
针对包含多个字段的自定义对象(如 User),可以通过组合多个 Predicate 或使用 Lambda 表达式中的逻辑运算符来实现多条件过滤。例如,需要同时满足年龄大于 18 且姓名不为空的条件时,可以在 filter 中直接使用 && 连接两个判断条件。这种方式比创建多个单独的过滤器更简洁,且性能一致。

import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;
class User {
String name;
int age;
User(String n, int a) { name = n; age = a; }
public String toString() { return name + ":" + age; }
}
public class Main {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User("Alice", 20),
new User("Bob", 17),
new User("Charlie", null), // 假设age可为null或处理逻辑
new User("David", 25)
);
// 过滤:年龄 >= 18 且 名字不为空
Predicate<User> valid = u -> u.age >= 18 && u.name != null;
List<User> result = users.stream().filter(valid).collect(Collectors.toList());
System.out.println(result); // [Alice:20, David:25]
}
}
Predicate 在 Stream 中的执行顺序与短路特性
当在 Stream 管道中连续使用多个 filter 操作时,它们会按顺序依次应用,并且由于 Stream 的惰性求值特性,只有当所有前置条件都满足时,后续的元素才会被传递到下一个过滤器。如果某个元素在前一个 filter 中被丢弃,它不会参与后续的判断,这体现了隐式的“短路”效果,有助于提升复杂过滤逻辑的执行效率。
立即学习“Java免费学习笔记(深入)”;


















