非最终变量的lambda

时间:2018-12-15 12:32:01

标签: java intellij-idea

我知道您不能在lambda中使用非final /有效的final变量。如果发生这种情况,则可能是您正在处理该对象的过时版本。我发现编译器没有抱怨此代码,其中函数参数可能不是最终的:

使用完整代码更新帖子:

public static void main(String[] args) {
    Object x=new Object();
    x=new Object();// I can reassign x as much as I can
    test(x);
}


  public static void test(Object x) {
// I can't reassign x here, shouldn't it disallow me to use function parameter ?
    List<String> list=new ArrayList<>();
    list.forEach(entry->System.out.println(entry+x)); // x here could be not final why the compiler didn't complain ?
}

2 个答案:

答案 0 :(得分:4)

答案就在您的问题中:因为x中的test是有效的 ,因为test中的任何内容都没有赋值。

请注意,x中的testx中的main之间没有任何联系。在main的某一点上,您确实读取了main的{​​{1}}的值并将该值传递给x,但传递的是 value ,而不是与test变量本身的某种连接或链接。 (Java是纯粹的pass-by-value语言。)两个x之间没有持续的连接。它们恰好都包含相同的值(对象引用)。可以分配给x的{​​{1}}的事实与是否可以分配给main的{​​{1}}无关。

答案 1 :(得分:3)

因为它实际上是最终的。变量或参数的值在初始化后从未更改,实际上是最终的。