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之间的上下文转换导致了混乱。谢谢