Java Predicate接口
外观
Java Predicate接口[编辑 | 编辑源代码]
Predicate<T>是Java 8引入的一个函数式接口,用于表示一个参数的布尔值函数(返回true或false)。它通常用于Lambda表达式和方法引用中,特别适合集合过滤、条件检查等场景。
接口定义[编辑 | 编辑源代码]
源码定义(简化版):
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
// 默认方法
default Predicate<T> and(Predicate<? super T> other) { /*...*/ }
default Predicate<T> or(Predicate<? super T> other) { /*...*/ }
default Predicate<T> negate() { /*...*/ }
}
核心方法[编辑 | 编辑源代码]
test()[编辑 | 编辑源代码]
基础方法,接受参数T并返回boolean:
Predicate<String> isEmpty = s -> s.isEmpty();
System.out.println(isEmpty.test("")); // 输出: true
System.out.println(isEmpty.test("Hello")); // 输出: false
组合方法[编辑 | 编辑源代码]
and()[编辑 | 编辑源代码]
逻辑与操作:
Predicate<Integer> isEven = n -> n % 2 == 0;
Predicate<Integer> isPositive = n -> n > 0;
System.out.println(isEven.and(isPositive).test(4)); // 输出: true
System.out.println(isEven.and(isPositive).test(-2)); // 输出: false
or()[编辑 | 编辑源代码]
逻辑或操作:
Predicate<String> startsWithA = s -> s.startsWith("A");
Predicate<String> endsWithZ = s -> s.endsWith("Z");
System.out.println(startsWithA.or(endsWithZ).test("Alpha")); // 输出: true
negate()[编辑 | 编辑源代码]
逻辑非操作:
Predicate<Double> isHighTemp = temp -> temp > 30.0;
System.out.println(isHighTemp.negate().test(25.0)); // 输出: true
静态方法[编辑 | 编辑源代码]
isEqual()[编辑 | 编辑源代码]
创建检查对象相等的Predicate:
Predicate<String> isHello = Predicate.isEqual("Hello");
System.out.println(isHello.test("Hello")); // 输出: true
实际应用案例[编辑 | 编辑源代码]
集合过滤[编辑 | 编辑源代码]
结合Stream API使用:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
Predicate<Integer> isEven = n -> n % 2 == 0;
List<Integer> evens = numbers.stream()
.filter(isEven)
.collect(Collectors.toList());
// 输出: [2, 4, 6]
条件验证[编辑 | 编辑源代码]
用户输入验证:
public class UserValidator {
private static final Predicate<String> isEmailValid =
email -> email.matches("^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$");
private static final Predicate<String> isPhoneValid =
phone -> phone.matches("^\\+?[0-9]{10,15}$");
public static boolean validateContact(String input) {
return isEmailValid.or(isPhoneValid).test(input);
}
}
高级用法[编辑 | 编辑源代码]
Predicate组合[编辑 | 编辑源代码]
动态构建复杂条件:
Predicate<String> isAdmin = user -> user.startsWith("admin_");
Predicate<String> hasPermission = perm -> perm.contains("write");
Predicate<String> canEdit = user ->
isAdmin.test(user) || hasPermission.test(getUserPermissions(user));
方法引用[编辑 | 编辑源代码]
与实例方法结合:
List<String> names = Arrays.asList("Alice", "Bob", null, "Charlie");
Predicate<String> nonNull = Objects::nonNull;
long count = names.stream().filter(nonNull).count(); // 输出: 3
性能考虑[编辑 | 编辑源代码]
- 简单Predicate通常会被JIT编译器优化
- 复杂链式调用可能产生多个临时对象
- 对于高频操作,考虑缓存Predicate实例
常见误区[编辑 | 编辑源代码]
页面模块:Message box/ambox.css没有内容。
* 忘记Predicate是惰性求值,直到调用test()才会执行
|
与其他接口对比[编辑 | 编辑源代码]
接口 | 输入参数 | 返回类型 | 典型用途 |
---|---|---|---|
Predicate<T> | T | boolean | 条件判断 |
Function<T,R> | T | R | 数据转换 |
Consumer<T> | T | void | 副作用操作 |
Supplier<T> | 无 | T | 值生成 |
数学表达[编辑 | 编辑源代码]
Predicate可视为数学中的特征函数:
视觉表示[编辑 | 编辑源代码]
最佳实践建议[编辑 | 编辑源代码]
- 优先使用静态final定义可重用Predicate
- 对复杂逻辑使用and()/or()组合而非嵌套if
- 为业务相关的Predicate起描述性名称
- 在Stream操作中保持Predicate无状态