Predicate接口是Java 8引入的函数式接口,位于java.util.function包下,核心作用是接收一个参数并返回布尔值,非常适合用来定义过滤条件。它的抽象方法是test,用来校验传入的参数是否满足预设条件,同时提供了and、or、negate等默认方法,支持条件组合。下面通过不同场景的示例展示如何使用Predicate实现过滤。

Predicate接口基础使用
首先来看最简单的单条件过滤场景,比如过滤出整数集合中大于10的元素。首先需要定义Predicate条件,然后遍历集合执行过滤。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class PredicateBasicDemo {
public static void main(String[] args) {
// 定义过滤条件:元素大于10
Predicate<Integer> greaterThanTen = num -> num > 10;
List<Integer> numList = new ArrayList<>();
numList.add(5);
numList.add(12);
numList.add(8);
numList.add(20);
numList.add(3);
List<Integer> result = new ArrayList<>();
for (Integer num : numList) {
// 调用test方法判断是否满足过滤条件
if (greaterThanTen.test(num)) {
result.add(num);
}
}
System.out.println("过滤后的结果:" + result);
}
}上述代码中,我们定义了判断数值大于10的Predicate,然后遍历原始集合,对符合条件的元素添加到结果集合中,最终输出过滤后的内容。
多条件组合过滤
实际开发中往往需要多个条件组合过滤,比如同时过滤出大于10且小于20的元素,这时候可以使用Predicate的and方法组合条件。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class PredicateCombineDemo {
public static void main(String[] args) {
// 条件1:大于10
Predicate<Integer> greaterThanTen = num -> num > 10;
// 条件2:小于20
Predicate<Integer> lessThanTwenty = num -> num < 20;
// 组合两个条件的与关系
Predicate<Integer> combinedCondition = greaterThanTen.and(lessThanTwenty);
List<Integer> numList = new ArrayList<>();
numList.add(5);
numList.add(12);
numList.add(18);
numList.add(25);
numList.add(3);
List<Integer> result = new ArrayList<>();
for (Integer num : numList) {
if (combinedCondition.test(num)) {
result.add(num);
}
}
System.out.println("组合条件过滤结果:" + result);
}
}除了and方法,Predicate还提供了or方法实现或逻辑,negate方法实现取反逻辑,比如要过滤出小于等于10的元素,可以直接使用greaterThanTen.negate()。
配合Stream流实现过滤
Java 8的Stream流提供了filter方法,参数正是Predicate接口,所以可以直接将Predicate条件传入filter方法,实现更简洁的过滤逻辑。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class PredicateStreamDemo {
public static void main(String[] args) {
// 定义判断字符串长度大于3的Predicate
Predicate<String> lengthGreaterThanThree = str -> str.length() > 3;
List<String> strList = new ArrayList<>();
strList.add("Java");
strList.add("Python");
strList.add("C");
strList.add("JavaScript");
strList.add("Go");
// 使用Stream的filter方法传入Predicate条件
List<String> result = strList.stream()
.filter(lengthGreaterThanThree)
.collect(Collectors.toList());
System.out.println("过滤后的字符串集合:" + result);
}
}这种方式不需要手动遍历集合,代码更加简洁,也是实际开发中最常用的Predicate过滤场景。
自定义对象过滤示例
Predicate同样可以用于自定义对象的过滤,比如过滤出用户列表中年龄大于18岁的用户。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class PredicateCustomObjectDemo {
public static void main(String[] args) {
// 定义过滤条件:用户年龄大于18
Predicate<User> ageGreaterThanEighteen = user -> user.getAge() > 18;
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 16));
userList.add(new User("李四", 20));
userList.add(new User("王五", 22));
userList.add(new User("赵六", 17));
List<User> adultUsers = userList.stream()
.filter(ageGreaterThanEighteen)
.collect(Collectors.toList());
System.out.println("成年用户姓名:");
adultUsers.forEach(user -> System.out.println(user.getName()));
}
}通过上述示例可以看出,Predicate接口可以灵活适配各类过滤场景,无论是基础类型还是自定义对象,都可以通过定义对应的Predicate条件实现精准过滤,结合Stream流使用时还能大幅简化代码逻辑。
JavaPredicate接口过滤函数式编程Stream流修改时间:2026-06-06 06:18:35