java三元运算符和惰性求值

时间:2016-06-01 08:04:58

标签: java ternary-operator operator-precedence

我试图一劳永逸地简化一个共同的条件:

public static void main(String[] args)
{
    boolean a = true;
    boolean b = false;
    boolean c = true;

    boolean t1 = (a && b) || (!a && c);
    boolean t2 = a ? b : c;

    System.out.println(t1);
    System.out.println(t2);
}

显然,t1t2是等效的。

有没有办法,使用运算符优先级来表示条件而不使用三元运算符并仅评估a一次?

由于

真实世界的例子:

if(execution.isActive() ? !Objects.equals(sourceStep, currentStep) : sourceStep != null)
{
    throw new IllegalStateException("current action is not allowed to be executed");
}

其中execution.isActive()是一项昂贵的操作。

根据我的口味,这根本不可读......我必须停下来思考,它不会立竿见影。

我的问题是可读性 vs 效率

3 个答案:

答案 0 :(得分:2)

在现实生活中,如果a实际上是一个昂贵的电话的结果,我只是把它提取到一个变量。

改变这个:

boolean t1 = (expensiveCall() && b) || (!expensiveCall() && c);

到此:

boolean result = expensiveCall();
boolean t1 = (result && b) || (!result && c);

但除此之外:我认为使用三元运算符没有任何问题。

答案 1 :(得分:1)

如果我希望代码更容易阅读,我宁愿这样做:

    private boolean isIllegalAction(execution,sourceStep,currentStep){
        return execution.isActive() ? !Objects.equals(sourceStep, currentStep) : sourceStep != null;
    }

    if(isIllegalAction(...)){
        //do something
    }

答案 2 :(得分:1)

  

我的问题是可读性与效率

很好。

  • 可读性。在许多情况下,内嵌if-then-else块可以提高代码的可读性。

考虑:

int result = (myObject.isCompleted())
        ? myObject.getStandardError()
        : myObject.computeStandardError().getStandardError();

...与:相比:

int result = 0;
if (myObject.isCompleted()) {
    result = myObject.getStandardError();
}
else {
    result = myObject.computeStandardError().getStandardError();
}

我会说内联if-then-else更具可读性,不是吗?

  • 效率。在逻辑上等效的内联if-then-else和if-then-else块(如果有的话)之间的处理时间差异几乎肯定是非常小并且在现实世界的应用程序中并不重要。因此,您选择产生最佳可读性的结构。在许多情况下,这是三元运营商......但不是所有情况。