簡體   English   中英

在Java中對“獲取和AND”布爾變量的操作

[英]Operation to “Get and AND” boolean variable in Java

在Java中是否可以使用類似( i++++i )的語法來表示布爾邏輯運算符?

我有一個布爾變量,僅在foreach循環的第一次迭代時才為真。 必須跳過那次迭代。

完整的語法是

for (...)
{
    if (bool)
    {
        bool &= false;
        continue;
    }
}

我想知道是否有任何方法可以在不使用AtomicBoolean情況下縮短語法。 例如,構造if (bool &= false)在語法上是正確的,但我認為它將比較最終結果而不是原始值。

谷歌不是我的朋友,因為搜索查詢具有誤導性

就個人而言,我會將您當前的代碼簡化為:

for (...)
{
    if (bool)
    {
        bool = false;
        continue;
    }
    // Rest of code
}

...但是如果你真的想在if條件下做副作用,你可以使用:

for (...)
{
    if (bool && !(bool = false))
    {
        continue;
    }
    // Rest of code
}

這里&&運算符的第一個操作數涵蓋后續操作,並且!(bool = false)將始終求值為true 並將 bool設置為false。

另一種選擇,來自評論:

for (...)
{
    if (bool | (bool = false))
    {
        continue;
    }
    // Rest of code
}

這會在每次迭代時執行賦值,但每次都會給出正確的結果。

真的,真的不會使用這兩個選項中的任何一個。

你的代碼是通常的事情。 但是,還有另一種選擇:

for (SomeType thing : Iterables.skip(things, 1)) {
    // process thing
}

這使用了Google Guava的Iterables.skip()方法並生成了您期望的輸出 - 每個循環遍歷集合並跳過第一個元素。

或者,只需使用整數變量並使用++進行后遞增。

int iter = 0;
for (...) {
    if (iter++ == 0) {
        continue;
    }
    ...
}

如果您想跳過第一次迭代,這可能更容易理解。

不要對布爾類型使用增量如果必須使用布爾值,要么切換它,例如!bool ,或者只是將其設置為false:

for (...){
    if (bool) {
        bool = false;
        continue;
    }
}

理想情況下,如果你想要的是跳過第一個,最后一個或第n個迭代,那么除了int之外不要使用布爾值...

    int skipIndex = 0;
    for(int index=0; index < 5; index++){
        if(index != skipIndex) {
            System.out.println(index);
        }
    }

...或以下內容僅跳過第一次迭代:

    int[] values = new int[]{0, 1, 2, 3, 4};
    for (int index = 1; index < values.length; index++) {
        System.out.println(values[index]);
    }       

如果(並且僅當)您確實非常確定您將始終需要繼續第一次迭代,為什么不跳過該迭代? 而不是從i=0開始,而不是從

for(i=1....

我一直在努力想知道為什么OP試圖使用bool &= false; bool = false時顯然會這樣做。 從這個意義上講, Jon Skeet的答案(不出所料)是正確的。

我認為OP實際上想要做的是將變量設置為false並一步測試它。 這就是引用AtomicBoolean的原因。 這與循環沒什么關系。 IE他想做同樣的事情:

int a=0;
for ( ... ) {
    if (a++ == 0 ) { // works if we aren't doing too many iterations
        continue;
    }
    ...
}

即他想要一個后增量算子的等價物。

如果我是對的,那不是他擔心的循環,這是a在這里被讀取一次,然后再單獨閱讀的事實。

這是過早優化的情況。 Java編譯器很可能(我沒有測試過它)來生成單個讀取和測試以及代碼

boolean a=false;
for ( ... ) {
    if (!a) {
        a = true;
        continue;
    }
}

正如Jon Skeet建議的那樣。

答案(完整性)是沒有對boolean起作用的后增量運算符,我無法確定如何定義一個函數,而不至少提及變量兩次。 但是,這不應該是設計考慮因素。

注意在真正的for循環中你可以這樣做:

int i;
boolean skip;
for (i=0, skip=true; i<10; i++, skip=false) {
    if (skip)
        continue;
}
for (int i = 0, boolean doIt = false; i < 10; i++, doit = true) {
    if (doIt) {
        doStuff();
    }
}

暫無
暫無

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

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