我开始尝试使用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表达式中看到它。
答案 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;