gpt4 book ai didi

java - 为什么在使用 for-each 时循环变量实际上是最终的?

转载 作者:行者123 更新时间:2023-12-04 17:06:21 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Enhanced 'for' loop and lambda expressions

(4 个回答)


1年前关闭。



  • 情况1:使用for-each循环时可以工作:
  •     private void m10(String[] arr) {
    for (String s : arr) {
    Supplier<String> supplier = () -> {
    System.out.println(s);
    return null;
    };
    supplier.get();
    }
    }

    或者
        private void m10(Object[] arr) {
    for (Object s : arr) {
    Supplier<String> supplier = () -> {
    System.out.println(s);
    return null;
    };
    supplier.get();
    }
    }
  • 情况 2:它会捕获编译时错误
  •     private void m11(String[] arr) {
    for (int i = 0; i < arr.length; i++) {
    Supplier<String> supplier = () -> {
    System.out.println(arr[i]);
    return null;
    };
    supplier.get();
    }
    }

    在情况 2 中,我知道变量 i不是最终的,因为它的值在循环迭代之间发生了变化。但我不明白为什么 lambda 可以在情况 1 中工作。

    最佳答案

    s永远不会改变( s = ... )。所以编译器说“是的,我们理论上可以将其标记为 final”。这就是有效最终的意思。 IE。你没有标记它final但你可以,它仍然会编译。

    如果您想知道增强的 for 循环:

    for (String s : arr)

    变量不在 for 的范围之外并且不会被重新分配。 IE。它是 不是 :
    String s = null;
    for (int i = 0; i < arr.length; i++) {
    s = arr[i];
    ...
    }

    该变量是在循环内部创建的,因此其作用域仅限于循环。它不会被重新使用,而是被丢弃并在每次迭代时重新创建:
    for (int i = 0; i < arr.length; i++) {
    String s = arr[i];
    ...
    }

    仔细看看这两个例子。首先,你不能写 final String s = null; ,因为我们在循环中重新分配它 s = arr[i]; .但是在第二个例子中我们可以,因为变量 s仅在一次迭代中已知,然后再次丢弃。所以 final String s = arr[i];很好。

    作为旁注,这也解释了为什么您不能使用 s循环后。它是未知的并且已经被销毁,它的范围仅限于循环。

    关于java - 为什么在使用 for-each 时循环变量实际上是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58517450/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com