是否可以使用不同的类型参数将谓词与“and”链接起来?

Is it possible to chain predicates with `and` using different type parameter?

我正在学习 Java 8 个 lambda。我可以在 Predicate 接口中使用和方法连接两个具有不同类型参数的谓词吗?

这是我的代码:

Predicate<Integer> pc = (iv) -> iv > 20;
Predicate<String> pL = (is) -> is.length() > 5;
System.out.println("The predicate result for pc is: " + pc.test(25));
System.out.println("===========");
System.out.println("The predicate result with both condition true: " + pc.and(pL.test("abcd")));

不,您不能链接不同类型的谓词,除非链接的 谓词 也接受原始谓词的类型。

查看签名,您可以很容易地看到:
and(Predicate<? super T> other)
or(Predicate<? super T> other)

您可以链接谓词:

Predicate<Person> isMale = p -> p.isMale();
Predicate<Person> isAdult = p -> p.age() >= AGE_OF_MATURITY;
Predicate<Person> isAdultMale = isAdult.and(isMale);

您只能将接受 至少 的谓词链接起来(这就是 ? super T 所说的)与原始谓词相同的类型:

Predicate<Object> hasWeirdHashCode = o -> o.hashCode() == 0;
Predicate<Person> nonsense = isMale.and(hasWeirdHashCode);

如果要测试不同类型(AB),需要分别提供:

Predicate<A> propertyOfA = [...];
Predicate<B> propertyOfB = [...];

BiPredicate<A,B> propertyOfAnB = (a, b) -> 
    propertyOfA.test(a) && propertyOfB.test(b);

如果需要两种以上的不同类型,需要自己滚,自定义TriPredicateQuadPredicate等功能接口,应该是straight-forward来实现。