我正在Java
中进行开发,并且正在使用IntelliJ
作为我的IDE。我写了一个if
语句,如下所示。
if( list1.size() >= 1 || list2.contains(itemX) ) {
//do something
}
IntelliJ
建议进行转换(DeMorgan's Law
)并将其转换为:
if( ! ( list1.size() < 1 && !( list2.contains(itemX) ) ) ) {
//do something
}
因此,它在简化布尔表达式时应用了非常普遍的离散数学理论。我想知道的是,这如何优化任何东西?
||
运算符无论如何在第一部分本身为true时不执行全部条件,仅在第一部分为false时才执行RHS。
转化条件有效吗?怎么样?
答案 0 :(得分:4)
这两个语句完全相同。
我同意如果第一部分为TRUE,则OR运算符不会评估第二部分,但是,如果第一部分为FALSE,则AND运算符也不会评估第二部分。
实际上,与A || B相比,评估〜(〜A &&〜B)会花费更多的时间和空间。
希望这会有所帮助:)
答案 1 :(得分:4)
这有点主观,但是一个好的通用经验法则是消除尽可能多的复杂性。所谓复杂性,是指您需要执行多少操作才能获得所需的结果。
从这个意义上讲,!a && !b
比!(a || b)
差,因为在一种情况下,您对a和b取反,然后执行and运算符,导致3次操作,而在后一种情况下,您仅执行2。当然,当您谈论两个条件时,这是虚无的,但是当您处理许多条件时,这可能会产生很大的不同。
但是在您的情况下,IDE更改它没有任何意义,因为后面的操作数量较少。可能是它的IDE试图拼命吸引你:)
希望这很有意义!