我开始尝试使用 Labda 表达式来实现 boolean 输入参数列表的 boolean 门。 对于“或”和“和”,我写了以下语句:
或: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 表达式中看到它。
最佳答案
如果你想知道是否只有一个匹配,你可以使用
expressions.stream().filter(e -> e.evaluate(input)).limit(2).count() == 1
limit(2)
避免了不必要的处理,因为一旦遇到两个匹配项,您就已经知道结果不可能是==1
,而无需计算其他匹配项。
然而,这不是“XOR”逻辑,甚至不是远程。如果你想要异或操作,你可以使用
expressions.stream().map(e -> e.evaluate(input)).reduce((a,b) -> a^b).orElse(Boolean.FALSE)
与 AND 或 OR 不同,异或运算无法短路。
关于java - boolean 值列表的 Java Lambda 表达式中的 XOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43805436/