You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Predicate<T> and方法:返回两Predicate<T>逻辑与的新断言

如何实现组合两个Predicate的逻辑与方法

嘿,我完全懂你的困惑!你知道怎么判断两个Predicate的test结果是否都为true,但不知道怎么把这个逻辑包装成一个新的Predicate实例对吧?其实有两种简单的方式可以实现,我给你一步步讲清楚:

方法一:用Lambda表达式直接创建新Predicate

因为Predicate是函数式接口,所以我们可以直接用lambda表达式来实现它的test方法逻辑。你的and方法只需要返回一个lambda,这个lambda接收T类型的参数,然后同时调用p1和p2的test方法,用逻辑与(&&)连接结果就行。

代码示例:

import java.util.function.Predicate;

public class PredicateHelper {
    // 实现你的and方法
    public static <T> Predicate<T> and(Predicate<T> p1, Predicate<T> p2) {
        // 返回一个新的Predicate,只有当p1和p2的test都为true时才返回true
        return t -> p1.test(t) && p2.test(t);
    }
}

方法二:利用Predicate自带的默认and方法

其实Java的Predicate接口本身就提供了一个and默认方法,专门用来组合两个Predicate的逻辑与。所以你根本不用自己写逻辑,直接调用这个方法就行,代码更简洁:

public static <T> Predicate<T> and(Predicate<T> p1, Predicate<T> p2) {
    // 直接使用Predicate自带的and默认方法组合两个Predicate
    return p1.and(p2);
}

测试一下效果

我们可以写个小例子验证一下:

public static void main(String[] args) {
    // 定义两个测试用的Predicate
    Predicate<String> isLengthOver3 = s -> s.length() > 3;
    Predicate<String> containsLetterB = s -> s.contains("B");
    
    // 组合成新的Predicate
    Predicate<String> combined = and(isLengthOver3, containsLetterB);
    
    // 测试几个字符串
    System.out.println(combined.test("Banana")); // true:长度>3且包含B
    System.out.println(combined.test("Apple"));  // false:不包含B
    System.out.println(combined.test("Bob"));    // false:长度不足3
}

关于你尝试过的andThen和test

你提到尝试过andThen和test,这里可能有点小混淆:

  • test方法是用来执行判断的,调用它会直接返回boolean结果,但你需要的是返回一个新的Predicate实例,而不是直接返回结果,所以不能直接在方法里调用test然后返回boolean。
  • andThen其实是Consumer或Function接口的方法,Predicate并没有这个方法,所以用它肯定行不通哦。

内容的提问来源于stack exchange,提问作者user5992911

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:02:32