Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这些陈述是等价的吗?_Java_Refactoring_Boolean Logic_Demorgans Law - Fatal编程技术网

Java 这些陈述是等价的吗?

Java 这些陈述是等价的吗?,java,refactoring,boolean-logic,demorgans-law,Java,Refactoring,Boolean Logic,Demorgans Law,我可以这样重构吗?这些是等价的,因此更简单的straighforward版本的代码是首选的吗 重构之前: if (!matcher.matches() && !matcher2.matches() && !matcher3.matches() && !matcher4.matches() && !matcher5.matches() && !matcher6.m

我可以这样重构吗?这些是等价的,因此更简单的straighforward版本的代码是首选的吗

重构之前:

    if (!matcher.matches() && !matcher2.matches() && !matcher3.matches()
            && !matcher4.matches() && !matcher5.matches()
            && !matcher6.matches() && !matcher7.matches()
            && !matcher8.matches()) {
        return true;
    } else
        return false;
    return (matcher.matches() || matcher2.matches() || matcher3.matches()
            || matcher4.matches() || matcher5.matches()
            || matcher6.matches() || matcher7.matches()
            || matcher8.matches()) 
重构后:

    if (!matcher.matches() && !matcher2.matches() && !matcher3.matches()
            && !matcher4.matches() && !matcher5.matches()
            && !matcher6.matches() && !matcher7.matches()
            && !matcher8.matches()) {
        return true;
    } else
        return false;
    return (matcher.matches() || matcher2.matches() || matcher3.matches()
            || matcher4.matches() || matcher5.matches()
            || matcher6.matches() || matcher7.matches()
            || matcher8.matches()) 

不,它们不是等价的。您必须添加
位于第二个选项前面

固定的第二个选项更明确:

return !(matcher.matches() || matcher2.matches() || matcher3.matches()
            || matcher4.matches() || matcher5.matches()
            || matcher6.matches() || matcher7.matches()
            || matcher8.matches()) 
我还将以这种方式重构它:

boolean atLeastOneMatch = matcher.matches() || matcher2.matches() || matcher3.matches()
                || matcher4.matches() || matcher5.matches()
                || matcher6.matches() || matcher7.matches()
                || matcher8.matches();

return !atLeastOneMatch;

事实上,不是。只有当所有匹配者都不匹配时,第一个才是
true
。如果第二条语句中的所有匹配项都不匹配,则返回
false

return !(matcher.matches() || matcher2.matches() || matcher3.matches()
            || matcher4.matches() || matcher5.matches()
            || matcher6.matches() || matcher7.matches()
            || matcher8.matches()) 

这是正确的

不,这些不是等效的。将其缩减一点以便更清晰-让我们仅使用两个示例,并将它们设为x和y,而不是“matcherX.matches()”。在这种情况下,你会问:

这两个相等吗

if (!x && !y) {
        return true;
    } else
        return false;

让我们慢慢来。首先,初始语句可以直接转换为

return (!x && !y);
以下是解决这一问题的方法:

|    x    |    y    |  !x && !y  |
+---------+---------+------------+
|    T    |    T    |     F      |
|    T    |    F    |     F      |
|    F    |    T    |     F      |
|    F    |    F    |     T      |
也就是说,只有当所有子表达式均为true时,第一个表达式才会返回
true
。那跟

return !(x || y);

是的,差不多:(你可能需要在最后应用一个额外的反转。我还没有检查。)事实上,任何有价值的IDE都会为你执行重构。Eclipse使用Ctrl+1,IntelliJ使用Alt+Enter