微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

考虑以下代码

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。