这个问题来自我的强迫症性质。 说我有这段代码。
boolean executed = false;
for(Object o : Collection){
if((o fulfills condition) && executed == false){
//do something
executed = true;
}
//other code
}
如果规范仅要求if语句执行一次,是否有比将executed设置为true更好的方法来跳过检查if条件? 令我困扰的是,在if语句已经执行之后,循环需要在每个循环中检查if条件。
执行布尔值的目的是防止if语句再次执行。 我不确定这是否可行,但是我想更进一步,并跳过一旦executed为true是否有条件的检查。
编辑:满足条件后,我仍然需要完成循环。
executed变为true后会发生什么?
什么是" continue"关键字的重复,它在Java中如何工作?
您是否要对所有元素仅执行一次某些操作(使该元素满足条件)?
continue;将开始下一次迭代,不确定这是否是您要寻找的。
通过到达continue关键字,程序将不得不检查是否有条件。 我想避免检查是否有条件。 我知道中断和继续,它们确实与我的问题无关。
并不是的;您每次都要使用此代码流来检查该条件。不过,有一些方法可以使其更便宜。
我建议不要使用continue,因为它会使您反复检查条件,然后失败,这可能不是您想要的。
最简单的操作可能是对布尔AND语句重新排序。
boolean executed = false;
for(Object o : Collection){
if(!executed && (o fulfills condition)){
executed = true;
}
//other code
}
由于Java的短路特性,您将仅检查!executed,并且在其第二次及以后的运行中,其结果将为false,从而"跳过"条件检查。
这很有帮助,谢谢。
我会采用不同的方式,如下所示:
int i = 0;
for ( ; 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
{
doSomethingElse(collection.get(i));
}
为了遍历列表并仅在第一次满足条件时执行任务,而不是随后再测试条件,可以利用Java and运算符的短路特性。请参见以下代码:
boolean performed = false;
for(Object o : Collection){
if(!performed && o fulfills condition){
//do something
performed = true;
}
//other code
}
执行任务后,performed标志将设置为true。当Java实现第一个操作数(&&之前的条件)的值为true时,它就不必计算o fulfills condition。这称为短路。当第二个操作数(o fulfills condition)是一个昂贵的计算,如果您不需要避免执行该计算时,此功能很有用。
不知道上下文,我建议的唯一改进是先检查执行情况-
boolean executed = false;
for(Object o : Collection){
if(executed == false && (o fulfills condition) ){
//do something
executed = true;
}
//other code
}
这将产生最少的副作用。否则,我不知道如何改善您的解决方案,因为您说" other-code"仍然需要执行。希望这可以帮助。
假设您仍然希望"其他代码"继续运行,并且条件测试可能很慢,请翻转测试和布尔值:
boolean doTest = true;
for(Object o : Collection){
if (doTest && (o fulfills condition)) {
doTest = false;
}
//other code
}
这样消除了负面影响,并且&&运算符可防止在doTest为false时评估条件。
doTest始终为true!doTest始终为false?
@KickButtowski doTest在条件也为true之前为true,此时它变为false:doTest = false;