在for循环中放置函数调用

时间:2015-03-12 03:56:26

标签: java performance

我有一个看起来更干净的功能:

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-each循环中有一个函数调用。我很确定编译器不会这样做,但是......在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;
}

正确?

2 个答案:

答案 0 :(得分:1)

是的,这是正确的。 for-each循环中的条件仅评估一次。

答案 1 :(得分: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