java - boolean 值列表的 Java Lambda 表达式中的 XOR

标签 java lambda xor

我开始尝试使用 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/

相关文章:

java - 将标志传递给对象的正确设计模式

java - 尝试使用 Esper Lambda 表达式

C++ Lambda 通过引用捕获

android - 返回类型为 () -> MultipartBody.Part!而不是 MultipartBody.Part

C - 使用 StdIn 和 StdOut 通过逐位过程进行一次性密码本加密

java - 无法访问 0 以外的索引

java - SQLiteOpenHelper 无法调用 onCreate?

java - 无法创建 Java 虚拟机,它表示不支持认可

perl - 为什么简单的 XOR 在 Perl 中不起作用?

Python 3.6 异或文件解密