是否可以使用不同的类型参数将谓词与“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);
如果要测试不同类型(A
、B
),需要分别提供:
Predicate<A> propertyOfA = [...];
Predicate<B> propertyOfB = [...];
BiPredicate<A,B> propertyOfAnB = (a, b) ->
propertyOfA.test(a) && propertyOfB.test(b);
如果需要两种以上的不同类型,需要自己滚,自定义TriPredicate
、QuadPredicate
等功能接口,应该是straight-forward来实现。
我正在学习 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);
如果要测试不同类型(A
、B
),需要分别提供:
Predicate<A> propertyOfA = [...];
Predicate<B> propertyOfB = [...];
BiPredicate<A,B> propertyOfAnB = (a, b) ->
propertyOfA.test(a) && propertyOfB.test(b);
如果需要两种以上的不同类型,需要自己滚,自定义TriPredicate
、QuadPredicate
等功能接口,应该是straight-forward来实现。