Java中的快捷方式“or-assignment”(|=)運算符




assignment-operator compound-assignment (6)

|| 邏輯布爾OR
| 按位或

| =按位包含的OR和賦值運算符

為什麼| =不是shortcircit是因為它執行了一個按位OR或不是邏輯OR。 也就是說:

C |= 2 is same as C = C | 2

Java運算符教程

我在Java中做了一系列比較,我想知道它們中的一個或多個是否真實。 比較的字符串很長,很難閱讀,所以為了便於閱讀而將其分解,並自動使用快捷鍵運算符|=而不是negativeValue = negativeValue || boolean negativeValue = negativeValue || boolean

boolean negativeValue = false;
negativeValue |= (defaultStock < 0);
negativeValue |= (defaultWholesale < 0);
negativeValue |= (defaultRetail < 0);
negativeValue |= (defaultDelivery < 0);

如果任何默認的<something>值為negativeValue ,我預計negativeValue為true。 這有效嗎? 它會做我期望的事情嗎? 我看不到它在Sun的站點或stackoverflow上提到它,但Eclipse似乎沒有問題,代碼編譯和運行。

同樣,如果我想執行幾個邏輯交點,我可以使用&=而不是&&


|=是布爾邏輯運算符|的複合賦值運算符( JLS 15.26.2 ) ( JLS 15.22.2 ); 不要與條件或||混淆 ( JLS 15.24 )。 還有&=^=對應於布爾邏輯&^的複合賦值版本。

換句話說,對於boolean b1, b2 ,這兩個是等價的:

 b1 |= b2;
 b1 = b1 | b2;

邏輯運算符( &| )與條件對應( &&|| )的區別在於前者不是“shortcircuit”; 後者呢。 那是:

  • &| 總是評估兩個操作數
  • &&|| 有條件地評估正確的操作數; 只有在其值可能影響二進制操作的結果時才評估右操作數。 這意味著在下列情況下不會評估右操作數:
    • &&的左操作數評估為false
      • (因為不管操作數的合理性如何,整個表達式都是false
    • ||的左操作數 評估為true
      • (因為不管操作數的合理性如何,整個表達式都是true

所以回到你原來的問題,是的,這個構造是有效的,而|=並不完全等同於=||快捷方式 它確實計算出你想要的。 由於您使用的|=運算符的右側是一個簡單的整數比較操作,因此| 不短路不重要。

有些情況下,當需要短路時,甚至需要,但你的情況不是其中之一。

不幸的是,與其他一些語言不同,Java沒有&&=||= 。 這個問題在Java中為什麼沒有條件語言和條件語言或運算符的複合賦值版本? (&& =,|| =)


儘管對於你的問題來說這可能是矯枉過正,但Guava圖書館有一些很好的語法,可以用Predicate進行,或者對Predicate進行短路評估。

實質上,比較變成對象,打包成一個集合,然後迭代。 對於或謂詞,第一次真正的命中從迭代返回,反之亦然。


如果是關於可讀性,我已經從測試邏輯中獲得了分離測試數據的概念。 代碼示例:

// declare data
DataType [] dataToTest = new DataType[] {
    defaultStock,
    defaultWholesale,
    defaultRetail,
    defaultDelivery
}

// define logic
boolean checkIfAnyNegative(DataType [] data) {
    boolean negativeValue = false;
    int i = 0;
    while (!negativeValue && i < data.length) {
        negativeValue = data[i++] < 0;
    }
    return negativeValue;
}

代碼看起來更加冗長和不言自明。 您甚至可以在方法調用中創建一個數組,如下所示:

checkIfAnyNegative(new DataType[] {
    defaultStock,
    defaultWholesale,
    defaultRetail,
    defaultDelivery
});

它比“比較字符串”更具可讀性,並且具有短路的性能優勢(以數組分配和方法調用為代價)。

編輯:通過使用可變參數可以簡單地實現更多的可讀性:

方法簽名將是:

boolean checkIfAnyNegative(DataType ... data)

通話可能如下所示:

checkIfAnyNegative( defaultStock, defaultWholesale, defaultRetail, defaultDelivery );

這是一個舊帖子,但為了給初學者提供不同的視角,我想舉個例子。

我認為類似複合運算符最常見的用例是+= 。 我相信我們都寫了這樣的東西:

int a = 10;   // a = 10
a += 5;   // a = 15

這是什麼意思? 這是為了避免在同一行寫兩次變量。 (我在這裡錯過了一些優越的東西?)

所以,下一行完全一樣,避免在同一行輸入兩次變量b1

b1 |= b2;

List<Integer> params = Arrays.asList (defaultStock, defaultWholesale, 
                                       defaultRetail, defaultDelivery);
int minParam = Collections.min (params);
negativeValue = minParam < 0;




or-operator