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

Java最终字符串参数在lambda表达式中未标记为编译时错误,java,lambda,functional-interface,Java,Lambda,Functional Interface,考虑以下代码: 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 = "H

考虑以下代码:

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引用,而是更改本地引用。

请参见以下示例:

publicstaticvoidmain(字符串[]args){
最后一个字符串str=“Hello”;
changeIt(str);
}
公共静态void changeIt(字符串s){
s=s+“世界”;
}

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

,lambda表达式正在重新分配它自己的局部变量
s
。我仍然不确定我是否理解,
s
不是指
str
?感谢您简洁明了地编写本文。C++与java之间的上下文转换导致了混乱。谢谢