Java 简化if条件布尔表达式

Java 简化if条件布尔表达式,java,if-statement,boolean-logic,boolean-expression,Java,If Statement,Boolean Logic,Boolean Expression,我的代码中有此if条件: if (a||a&&!b){ // do some stuff } 使用我的junit测试中的初始值: boolean a=true, b = true; 正如我后来认识到的,该声明可以简化为: if (a&&b) 变为绿色:Assert.assertTrue(a | a&&!b==a&&b) 有没有进一步的简化?我怎么知道这个布尔表达式可以简化呢?简化复杂布尔表达式的一种常用技术是。它相对容易学习,并且可以帮助您生成较短的表达式,

我的代码中有此
if条件

if (a||a&&!b){
// do some stuff
}
使用我的junit测试中的初始值:

boolean a=true, b = true;
正如我后来认识到的,该声明可以简化为:

if (a&&b)
变为绿色:
Assert.assertTrue(a | a&&!b==a&&b)


有没有进一步的简化?我怎么知道这个布尔表达式可以简化呢?

简化复杂布尔表达式的一种常用技术是。它相对容易学习,并且可以帮助您生成较短的表达式,甚至可以从真值表构建布尔表达式

表达式的卡诺图非常简单-它看起来如下所示:

它简化为
a
,而不是
a和&b

只需检查真值表(我添加了括号)

如我们所见,公式不依赖于
b
,可以简化为

  a
最后

  if (a) {
    // do some stuff
  }
对于具有多个变量的公式,当真值表对于手动分析来说太长时,可以使用Eomm建议的卡诺图

a || a && !b 
不等于

a && b
它只相当于
a

我假设在JUnit测试中,您在结果匹配的地方使用了
a
b
的特定值组合,但这并不意味着表达式是等价的,事实上它们不是。让自己相信这一点的一个快速方法是检查组合

a = true, b = false;
对于
a==true
的所有情况,您的原始表达式显然会生成
true
,但无论何时
b==false
,您的第二个表达式都会生成
false

至于等价于
a
的形式证明,请采用展开式

a == a && (b || !b)
  == a && b || a && !b
插入原始表达式:

a || a && !b == a && b || a && !b || a && !b
             == a && b || a && !b
             == a

a | | a&&!b
不等于
a和&b
。它只相当于
a
。我强烈建议使用空格,以使您的代码更易于阅读。。。在需要一段时间才能计算出优先级的括号也会有所帮助。Wolfram Alpha实际上做布尔代数的简化。可能需要对它给出的答案进行一点转换,以使其与编程语言兼容,但这个概念很好地工作并得到验证。布尔代数允许您简化布尔表达式。是的。布尔代数是用来简化的。如果你是对的,我的应用程序工作正常。只需一步即可简化(吸收)
a || a && !b == a && b || a && !b || a && !b
             == a && b || a && !b
             == a