如何实现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
相关产品推荐
相关产品推荐

