如何异或谓词?

我需要一个方法,我需要对谓词进行异或,我将其作为方法参数接收。对于两个谓词,我有一个有点工作但很麻烦的解决方案。举一个简单的、最小的和可重复的例子:

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);
}


以上是如何异或谓词?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>