2015-03-12 4 views
3

У меня есть функция, которая выглядит намного чище этот путь:Размещение вызова функции в цикле

public static List<Integer> permuteDigits(int number) { 
    List<Integer> permutations = new ArrayList<>(); 

    for (String s : permutations(String.valueOf(number))) 
     permutations.add(Integer.parseInt(s)); 

    return permutations; 
} 

Но вы можете видеть, что есть вызов функции внутри цикла для каждого-. Я уверен, что компилятор этого не делает, но ... функция не вызывается на каждой итерации цикла for, не так ли?

Я почти уверен, что это не тот случай, но я просто хотел убедиться. Иными словами, приведенный выше код не менее эффективен, чем следующие:

public static List<Integer> permuteDigits(int number) { 
    List<String> strPerms = permutations(String.valueOf(number)); 
    List<Integer> permutations = new ArrayList<>(); 

    for (String s : strPerms) 
     permutations.add(Integer.parseInt(s)); 

    return permutations; 
} 

Исправить?

ответ

1

В первом кодовом блоке permutations(String.valueOf(number)) будет вызываться один раз, вернуть его результат, а затем цикл for будет перебирать элементы в результате. Как и в примере, приведенном ниже:

static List<Integer> createNumbers() { 
    System.out.println("createNumbers"); 
    return Arrays.asList(0, 1, 2); 
} 

public static void main(String[] args) { 
    for (Integer num : createNumbers()) { 
     System.out.println(num); 
    } 
} 

Результат показывает, что createNumbers() был вызван только один раз:

createNumbers 
0 
1 
2 
1

Да, это правильно. Условие в цикле for-each оценивается только один раз.

Смежные вопросы