Java 布尔值列表的 Lambda 表达式中的 XOR

XOR in Java Lambda Expression for a List of boolean

我开始尝试使用 Labda 表达式来实现布尔输入参数列表的布尔门。 对于 "or" 和 "and" 我写了以下语句:

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

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

e.evaluate(input) returns 对或错。 但是由于没有已经实现的 onceMatch 方法,我坚持使用 XOR。

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

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

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

我想不出适合您需要的 lambda 表达式,但我认为对您的第一个想法稍作重构:

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

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

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

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

然而,这不是“异或”逻辑,甚至不是。如果你想要异或运算,你可以使用

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

与 AND 或 OR 不同,异或运算无法短路。