Efficient implementation for: "Python For Else Loop" in Java
Question:
In Python there is an efficient for .. else
loop implementation described
here
Example code:
for x in range(2, n):
if n % x == 0:
print n, 'equals', x, '*', n/x
break
else:
# loop fell through without finding a factor
print n, 'is a prime number'
In Java I need to write more code to achieve the same behavior:
finishedForLoop = true;
for (int x : rangeListOfIntegers){
if (n % x == 0)
{
//syso: Some printing here
finishedForLoop = false
break;
}
}
if (finishedForLoop == true){
//syso: Some printing here
}
Is there any better implementation similar to Python for .. else
loop in Java?
Answers:
No. That’s the simplest. It’s not that complicated, it’s just syntax.
No, there is no mechanism like this in Java
When I need to do something like this, if no extra information is needed, I typically try to break it out into a separate method – which can then return true
/false
or alternatively either the value found, or null if it’s not found. It doesn’t always work – it’s very context-specific – but it’s something worth trying.
Then you can just write:
for (...) {
if (...) {
return separateMethod();
}
}
return null; // Or false, or whatever
It’s done like this:
class A {
public static void main(String[] args) {
int n = 13;
found: {
for (int x : new int[]{2,3,4,5,6,7,8,9,10,11,12})
if (n % x == 0) {
System.out.println("" + n + " equals " + x + "*" + (n/x));
break found;
}
System.out.println("" + n + " is a prime number");
}
}
}
$ javac A.java && java A
13 is a prime number
Since java8 there is a way to write this with “nearly no” code:
if(IntStream.range(2, n).noneMatch(x -> n % x == 0)) {
System.out.println(n + " is a prime number");
}
BUT: this would be less efficient than the classical looping-with-break-and-flag method.
In Python there is an efficient for .. else
loop implementation described
here
Example code:
for x in range(2, n):
if n % x == 0:
print n, 'equals', x, '*', n/x
break
else:
# loop fell through without finding a factor
print n, 'is a prime number'
In Java I need to write more code to achieve the same behavior:
finishedForLoop = true;
for (int x : rangeListOfIntegers){
if (n % x == 0)
{
//syso: Some printing here
finishedForLoop = false
break;
}
}
if (finishedForLoop == true){
//syso: Some printing here
}
Is there any better implementation similar to Python for .. else
loop in Java?
No. That’s the simplest. It’s not that complicated, it’s just syntax.
No, there is no mechanism like this in Java
When I need to do something like this, if no extra information is needed, I typically try to break it out into a separate method – which can then return true
/false
or alternatively either the value found, or null if it’s not found. It doesn’t always work – it’s very context-specific – but it’s something worth trying.
Then you can just write:
for (...) {
if (...) {
return separateMethod();
}
}
return null; // Or false, or whatever
It’s done like this:
class A {
public static void main(String[] args) {
int n = 13;
found: {
for (int x : new int[]{2,3,4,5,6,7,8,9,10,11,12})
if (n % x == 0) {
System.out.println("" + n + " equals " + x + "*" + (n/x));
break found;
}
System.out.println("" + n + " is a prime number");
}
}
}
$ javac A.java && java A
13 is a prime number
Since java8 there is a way to write this with “nearly no” code:
if(IntStream.range(2, n).noneMatch(x -> n % x == 0)) {
System.out.println(n + " is a prime number");
}
BUT: this would be less efficient than the classical looping-with-break-and-flag method.