函数式接口Predicate是Java 8引入的重要特性之一,位于java.util.function包下,核心作用是接收一个参数并返回布尔值,非常适合用来做判断逻辑的定义和复用。在集合过滤、状态校验等场景中,合理运用Predicate可以大幅减少重复的判断代码,让逻辑更清晰。

Predicate基础用法
Predicate接口只有一个抽象方法test(T t),用来执行判断逻辑,返回true或false。我们可以通过lambda表达式快速实现这个接口,定义自己的判断规则。
下面是一个简单的示例,定义一个判断整数是否为正数的Predicate:
import java.util.function.Predicate;
public class PredicateDemo {
public static void main(String[] args) {
// 定义判断整数是否为正数的Predicate
Predicate<Integer> isPositive = num -> num > 0;
// 执行判断
System.out.println(isPositive.test(5)); // 输出true
System.out.println(isPositive.test(-3)); // 输出false
}
}
多重条件过滤实现
Predicate提供了三个默认方法用于组合判断条件,分别是and()(与)、or()(或)、negate()(非),可以轻松实现多重条件的组合过滤。
条件组合方法说明
- and(Predicate other):当前判断和other判断都为true时,返回true
- or(Predicate other):当前判断和other判断有一个为true时,返回true
- negate():返回当前判断的反结果
集合多重过滤实战
假设我们有一个用户列表,需要过滤出年龄大于18岁且会员状态为true的用户,就可以用and方法组合两个条件:
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;
private boolean isVip;
public User(String name, int age, boolean isVip) {
this.name = name;
this.age = age;
this.isVip = isVip;
}
public int getAge() { return age; }
public boolean isVip() { return isVip; }
public String getName() { return name; }
}
public class MultiFilterDemo {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 20, true));
userList.add(new User("李四", 16, true));
userList.add(new User("王五", 22, false));
userList.add(new User("赵六", 25, true));
// 定义年龄大于18的条件
Predicate<User> ageGt18 = user -> user.getAge() > 18;
// 定义是会员的条件
Predicate<User> isVip = user -> user.isVip();
// 组合两个条件:年龄大于18 且 是会员
Predicate<User> filterCondition = ageGt18.and(isVip);
// 执行过滤
List<User> result = userList.stream()
.filter(filterCondition)
.collect(Collectors.toList());
// 输出结果
for (User user : result) {
System.out.println(user.getName()); // 输出张三、赵六
}
}
}
变量状态判定实战
除了集合过滤,Predicate还可以用来做变量状态的动态判定,比如根据不同的业务场景切换判断规则,避免写大量的if-else分支。
下面的示例演示了根据业务类型动态选择状态判定规则:
import java.util.function.Predicate;
public class StateJudgeDemo {
// 普通用户的状态判定:积分大于100
private static Predicate<Integer> normalUserRule = score -> score > 100;
// VIP用户的状态判定:积分大于50
private static Predicate<Integer> vipUserRule = score -> score > 50;
public static boolean judgeState(boolean isVip, int score) {
// 根据是否为VIP选择对应的判定规则
Predicate<Integer> currentRule = isVip ? vipUserRule : normalUserRule;
return currentRule.test(score);
}
public static void main(String[] args) {
System.out.println(judgeState(false, 80)); // 普通用户80积分,输出false
System.out.println(judgeState(true, 80)); // VIP用户80积分,输出true
}
}
使用注意事项
- Predicate的判断逻辑尽量保持单一职责,一个Predicate只做一种判断,复杂的逻辑通过组合实现
- 组合条件时注意and和or的优先级,必要时可以用括号包裹Predicate对象明确执行顺序
- 如果判断逻辑比较复杂,可以将lambda表达式替换为方法引用或者单独的方法实现,提升代码可读性
Predicate作为函数式接口,非常适合和Stream API配合使用,在数据处理链中做灵活的过滤操作,是简化判断逻辑的有效工具。