Java Lambda Expression中的XOR表示布尔值列表

时间:2017-05-05 12:49:29

标签: java lambda xor

我开始尝试使用Labda表达式来实现布尔值,以获得布尔输入参数列表。 对于"或"和"和"我写了以下的陈述:

OR:expressions.stream().anyMatch(e -> e.evaluate(input));

AND:expressions.stream().allMatch(e -> e.evaluate(input));

e.evaluate(input)返回true或false。 但是由于没有已经实现的onceMatch方法,我仍然坚持使用XOR。

首先想法是过滤所有真值并检查它是否只是一个:

return expressions.stream().filter(e -> e.evaluate(input) == true).collect(Collectors.counting()) == 1;

但我想在一个lambda表达式中看到它。

2 个答案:

答案 0 :(得分:7)

如果您想知道是否只有一个匹配,您可以使用

expressions.stream().filter(e -> e.evaluate(input)).limit(2).count() == 1

limit(2)避免了不必要的处理,因为一旦遇到两场比赛,您就已经知道结果不能是==1,而不需要计算其他匹配。

但是,这不是“XOR”逻辑,甚至不是远程逻辑。如果您想要XOR操作,可以使用

expressions.stream().map(e -> e.evaluate(input)).reduce((a,b) -> a^b).orElse(Boolean.FALSE)

与AND或OR不同,无法使XOR操作短路。

答案 1 :(得分:1)

我无法想出一个能满足你需求的lambda表达式,但对你的第一个想法的轻微重构看起来很好:

return expressions.stream().filter(e -> e.evaluate(input)).count() == 1;