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 不同,异或运算无法短路。
我开始尝试使用 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 不同,异或运算无法短路。