这个问题来自我的OCD-ish性质。说我有这段代码。
boolean executed = false;
for(Object o : Collection){
if((o fulfills condition) && executed == false){
//do something
executed = true;
}
//other code
}
如果规范只要求if语句执行一次,是否有更好的方法可以跳过检查 if条件而不是将executed
设置为true?令我困扰的是,在if语句已经执行之后,循环需要检查if条件每个循环迭代。
执行布尔值的目的是防止if语句再次执行。我不确定这是否可行,但我想更进一步,并在executed
为true
后跳过检查if条件。
编辑:我仍然需要在满足条件后完成循环。
答案 0 :(得分:6)
不是真的;您每次使用此代码流时都会检查该条件。但是,有一些方法可以降低成本。
我建议不要使用false
,因为它会导致你反复检查条件而然后会失败,这可能不是你想要的。
最简单的方法是重新排序布尔AND语句。
continue
由于Java的短路性质,您只会检查boolean executed = false;
for(Object o : Collection){
if(!executed && (o fulfills condition)){
executed = true;
}
//other code
}
及其第二次和未来的运行,它将评估为!executed
,因此"跳过& #34;有条件的检查。
答案 1 :(得分:1)
我会采用不同的方式,如下所示:
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));
}
答案 2 :(得分:0)
假设您仍然需要&#34;其他代码&#34;继续运行,条件测试可能慢,翻转测试和布尔值:
print(sorted(votes.items(), key = lambda x: x[1]))
这消除了否定,boolean doTest = true;
for(Object o : Collection){
if (doTest && (o fulfills condition)) {
doTest = false;
}
//other code
}
运算符阻止在&&
为doTest
后评估条件。
答案 3 :(得分:0)
不知道上下文,我建议的唯一改进是检查执行第一 -
boolean executed = false;
for(Object o : Collection){
if(executed == false && (o fulfills condition) ){
//do something
executed = true;
}
//other code
}
这将产生最少的副作用。否则,我不知道如何改进您的解决方案,因为您说&#34;其他代码&#34;仍然需要执行。希望这会有所帮助。
答案 4 :(得分:0)
为了遍历列表并在第一次满足条件时执行任务,而不是之后测试条件,您可以利用Java {{1}的短路特性运算符。请参阅以下代码:
and
执行任务后,boolean performed = false;
for(Object o : Collection){
if(!performed && o fulfills condition){
//do something
performed = true;
}
//other code
}
标志将设置为true。当Java实现第一个操作数(performed
之前的条件)求值为true时,它不会计算&&
。这称为短路。当第二个操作数(o fulfills condition
)是一个昂贵的计算时,如果没有必要,您希望避免执行此操作,这非常有用。