跳转到内容

Java Predicate接口

来自代码酷

模板:Note

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<T> T boolean 条件判断
Function<T,R> T R 数据转换
Consumer<T> T void 副作用操作
Supplier<T> T 值生成

数学表达[编辑 | 编辑源代码]

Predicate可视为数学中的特征函数: χA(x)={1当 xA0当 xA

视觉表示[编辑 | 编辑源代码]

graph LR A[输入对象] --> B{Predicate.test} B -->|true| C[包含在结果中] B -->|false| D[被过滤掉]

最佳实践建议[编辑 | 编辑源代码]

  1. 优先使用静态final定义可重用Predicate
  2. 对复杂逻辑使用and()/or()组合而非嵌套if
  3. 为业务相关的Predicate起描述性名称
  4. 在Stream操作中保持Predicate无状态

模板:JavaLambdaNavbox