Подтвердить что ты не робот

Эффективная реализация для: "Python For Else Loop" в Java

В Python существует эффективная реализация цикла else else здесь

Пример кода:

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'

В Java мне нужно написать больше кода для достижения такого же поведения:

finishedForLoop = true;
for (int x : rangeListOfIntegers){
    if (n % x == 0)
    {
        //syso: Some printing here
        finishedForLoop = false
        break;
    }
}
if (finishedForLoop == true){
    //syso: Some printing here
}

Есть ли какая-нибудь лучшая реализация, подобная петле Python for else в Java?

4b9b3361

Ответ 1

Сделано вот так:

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

Ответ 2

Когда мне нужно сделать что-то вроде этого, если дополнительная информация не требуется, я обычно пытаюсь разбить ее на отдельный метод, который затем может вернуть true/false или, альтернативно, либо найденное значение, либо null, если он не найден. Это не всегда работает - это очень контекстно-специфическое, но это что-то стоит попробовать.

Тогда вы можете просто написать:

for (...) {
    if (...) {
       return separateMethod();
    }
}
return null; // Or false, or whatever

Ответ 3

Нет. Это самое простое. Это не так сложно, это просто синтаксис.

Ответ 4

Нет, в Java нет такого механизма, как

Ответ 5

Так как java8 есть способ записать это с кодом "почти нет":

if(IntStream.range(2, n).noneMatch(x -> n % x == 0)) {
   System.out.println(n + " is a prime number");
}

НО: это будет менее эффективно, чем классический метод looping-with-break-and-flag.