Reputation: 15992
This question comes from my OCD-ish nature. Say i have this piece of code.
boolean executed = false;
for(Object o : Collection){
if((o fulfills condition) && executed == false){
//do something
executed = true;
}
//other code
}
If the specification only requires that the if statement executes once, is there a better way to skip checking the if conditional than setting executed
to true? It bothers me that the loop needs to check the if conditional every single loop iteration, after the if statement has already been executed.
The point of the executed boolean is to prevent the if statement from executing again. I'm not sure this is possible, but i want to take it one step further, and skip checking the if conditional once executed
is true
.
EDIT: I still need to finish the loop after the condition is met.
Upvotes: 6
Views: 21614
Reputation: 1053
i would go with a different way, like below:
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));
}
Upvotes: 2
Reputation: 2148
In order to loop through a list and perform a task only the first time a condition is met, and not test the condition afterwards, you can make use of the short-circuit nature of Java's and
operator. See the following code:
boolean performed = false;
for(Object o : Collection){
if(!performed && o fulfills condition){
//do something
performed = true;
}
//other code
}
After the task is performed, the performed
flag will be set to true. When Java realizes the first operand (the condition before the &&
) evaluates to true, it doesn't bother calculating o fulfills condition
. This is called short-circuiting. This is useful when the second operand (o fulfills condition
) is an expensive calculation that you want to avoid performing if it's not necessary.
Upvotes: 0
Reputation: 1042
Not knowing the context, the only improvement I would suggest is to check for executed first -
boolean executed = false;
for(Object o : Collection){
if(executed == false && (o fulfills condition) ){
//do something
executed = true;
}
//other code
}
This will have the least side-effects. Otherwise, I don't know how to improve your solution since you say "other-code" still need to execute. Hope this helps.
Upvotes: 0
Reputation: 106420
Not really; you're stuck checking that conditional each time with this code flow. There are ways to make it less expensive, though.
I would advise against using continue
, since it will cause you to check the conditional repeatedly and then fall through, which probably isn't what you want.
The simplest thing to do may be to reorder the boolean AND statement.
boolean executed = false;
for(Object o : Collection){
if(!executed && (o fulfills condition)){
executed = true;
}
//other code
}
Due to Java's short-circuit nature, you will only ever check !executed
, and on its second and future runs, that will evaluate to false
, thus "skipping" the conditional check.
Upvotes: 7
Reputation: 159086
Assuming you still want "other code" to keep running, and that the condition test might be slow, flip the tests and the boolean:
boolean doTest = true;
for(Object o : Collection){
if (doTest && (o fulfills condition)) {
doTest = false;
}
//other code
}
This eliminates the negative, and the &&
operator prevent the condition from being evaluated once doTest
is false
.
Upvotes: 0