Java 最终字符串参数未标记为 lambda 表达式中的编译时错误

Java final string parameter is not marked as compile time error in lambda expression

考虑以下代码:

public class Test {
  interface Changeable {
    void change(String s);
  }

  public static void main(String[] args) {
    Test t = new Test();
    Changeable c = (s) -> s = s + " World"; // Line 1
    final String str = "Hello";
    t.changeIt(str, c);  // Line 2
    t.changeIt(str, (s) -> s = s + " Hello");  // Line 3
    System.out.println(str);
  }

  public void changeIt(String s, Changeable c) {
    c.change(s);
  }
}

在这种情况下,最终变量 str 如何能够满足上述 lambda。也许我对代码的解释有误,但它 看起来 就像 lambda 表达式正在重新分配 str 变量。 运行 代码(并看到它编译)显然与此矛盾,我错过了什么?

您的表达式等同于:

Changeable c = new Changeable() {
  void change(String s) {
    s = s + "World";
  }
}

但是 s 是字符串的本地引用,因此重新分配 s 并没有更改原始 str 引用,只是更改了本地引用。

例如看这个:

public static void main(String[] args) {
    final String str = "Hello";
    changeIt(str);
}

public static void changeIt(String s){
    s = s + "World";
}

Java 中的括号描述了您的范围。这样的字符串 str 仅存在于您的 main-Method 的范围内。如果您传递它并重新分配它,那不会影响 str,因此它不会干扰 final.