如何异或谓词?
我需要一个方法,我需要对谓词进行异或,我将其作为方法参数接收。对于两个谓词,我有一个有点工作但很麻烦的解决方案。举一个简单的、最小的和可重复的例子:
Predicate<String> pred1 = s -> s.contains("foo");
Predicate<String> pred2 = s -> s.contains("bar");
String toTest = "foobar";
对于给定的谓词和测试字符串,逻辑OR将返回true:
boolean oneOnly = pred1.or(pred2).test(toTest);
但对于我的用例,它应该返回 false,因为包含两个子字符串。当且仅当满足一个条件时,它才应该返回 true。
对于两个prdeicates我有这个
static boolean xor(Predicate<String> pred1, Predicate<String> pred2, String toTest){
return pred1.and(pred2.negate()).or(pred2.and(pred1.negate())).test(toTest);
}
是否有一种简单但方便的方法来异或谓词?
回答
在@xdhmoore 的回答的后续行动中,这太过分了,而且可以更简单地完成:
static <T> Predicate<T> xor(Predicate<T> pred1, Predicate<T> pred2) {
return t -> pred1.test(t) ^ pred2.test(t);
}