簡體   English   中英

java三元運算符和惰性求值

[英]java ternary operator and lazy evaluation

我試圖一勞永逸地簡化一個常見條件:

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()是一項昂貴的操作。

就我的口味而言,這根本無法理解...我必須停下來思考,這不是立即的。

我的問題是可讀性效率

在現實生活中,如果a實際上是一個昂貴的通話的結果,我將其提取到一個變量中。

改變這個:

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

對此:

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

但除此之外:使用三元運算符沒有任何問題。

如果我希望代碼更易於閱讀,我寧願這樣:

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

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

我的問題是關於可讀性與效率

很好。

  • 可讀性。 在許多情況下,內聯的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塊(如果有)之間的處理時間差幾乎可以確定很小,並且在實際應用中並不重要。 因此,您選擇具有最佳可讀性的結構。 在許多情況下,這是三元運算符...但不是所有情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM