2015-08-26 3 views
1

Этот вопрос исходит из моей природы OCD-иш. Скажем, у меня есть этот фрагмент кода.Пропустить if-statement после выполнения условия

boolean executed = false; 
for(Object o : Collection){ 
    if((o fulfills condition) && executed == false){ 
     //do something 
     executed = true; 
    } 
    //other code 
} 

Если спецификация требует только, что если оператор выполняет раз, есть лучший способ, чтобы пропустить проверки КРП условную, чем установка executed к истинным? Меня беспокоит, что цикл должен проверять if-условие для каждой отдельной итерации цикла, после того, как оператор if уже выполнен.

Точка выполненного булева должна исключать выполнение оператора if. Я не уверен, что это возможно, но я хочу сделать это еще на один шаг и пропустить проверку условного условия, если executed - true.

EDIT: Мне еще нужно закончить цикл после выполнения условия.

+0

Что происходит после '' 'executed''' становится правдой? – RandomQuestion

+0

Возможный дубликат [Что такое ключевое слово «продолжить» и как оно работает в Java?] (Http://stackoverflow.com/questions/389741/what-is-the-continue-keyword-and-how-does- it-work-in-java) –

+0

Вы хотите применить некоторую операцию (что делает условие выполнения элемента) для всех элементов только один раз? – RandomQuestion

ответ

5

Не действительно; вы застряли, проверяя это условно каждый раз с помощью этого потока кода. Однако есть способы сделать его менее дорогостоящим.

Я бы посоветовал против использования continue, так как это заставит вас проверить условную неоднократно и затем провалиться, что, вероятно, это не то, что вы хотите.

Проще всего сделать это, чтобы изменить порядок логического оператора AND.

boolean executed = false; 
for(Object o : Collection){ 
    if(!executed && (o fulfills condition)){ 
     executed = true; 
    } 
    //other code 
} 

Благодаря короткому замыканию природе Java, вы будете только когда-либо проверить !executed, и на его второй и последующих серий, которые будут вычисляться false, таким образом, «пропуск» проверку условий.

+1

Это полезно. –

0

Предполагая, что вы все еще хотите «другой код», чтобы продолжать работать, и что проверяемое условие может быть медленным, флип-тесты и логическое:

boolean doTest = true; 
for(Object o : Collection){ 
    if (doTest && (o fulfills condition)) { 
     doTest = false; 
    } 
    //other code 
} 

Это устраняет отрицательное и && оператор предотвращает оценку состояния после того, как doTest - false.

+0

doTest всегда верно здесь! DoTest всегда ложь? –

+0

@KickButtowski 'doTest' истинно до тех пор, пока условие не будет истинным, и в этот момент оно станет ложным:' doTest = false; ' – Andreas

0

Не зная контекста, единственное улучшение, я хотел бы предложить, чтобы проверить выполняется первый -

boolean executed = false; 
for(Object o : Collection){ 
    if(executed == false && (o fulfills condition)){ 
     //do something 
     executed = true; 
    } 
    //other code 
} 

Это будет иметь минимум побочных эффектов. В противном случае я не знаю, как улучшить ваше решение, так как вы говорите, что «другой-код» по-прежнему необходимо выполнить. Надеюсь это поможет.

0

Чтобы выполнить цикл и выполнить задачу только в первый раз, когда выполняется условие, а затем не проверять состояние, вы можете использовать характер короткого замыкания оператора and Java. Смотрите следующий код:

boolean performed = false; 
for(Object o : Collection){ 
    if(!performed && o fulfills condition){ 
     //do something 
     performed = true; 
    } 
    //other code 
} 

После того как задача выполняется, то performed флаг будет установлен в действительности. Когда Java реализует первый операнд (условие до &&) оценивается как true, он не беспокоится о вычислении o fulfills condition. Это называется короткозамкнутым.Это полезно, когда второй операнд (o fulfills condition) является дорогостоящим калькулятором, который вы хотите избежать, если это не необходимо.

0

я бы с другим способом, как показано ниже:

int i = 0; 
for (; i<collection.size() ; i++) 
{ 
    Object o = collection.get(i); 
    if (o fulfills condition) 
    { 
     // do what you gotta do and then 
     break; 
    } 
    doSomethingElse(o); // define a private method for whatever is done here 
} 
for (; i<collection.size() ; i++) 
{ 
    doSomethingElse(collection.get(i)); 
} 
Смежные вопросы