[英]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.