根据JavaDoc任何使用但未在 lambda 表达式中声明的局部变量、形式参数或异常参数必须声明为 final 或有效地为 final(第 4.12.4 节),否则在尝试使用时会发生编译时错误。任何使用但未在 lambda 主体中声明的局部变量必须在 lambda 主体之前明确分配(第 16 节(定义分配)),否则会发生编译时错误。变量使用的类似规则适用于内部类的主体(第 8.1.3 节)。对有效最终变量的限制禁止访问动态变化的局部变量,这些变量的捕获可能会引入并发问题。与最终的限制相比,它减轻了程序员的文书负担。规则1是arrays例外吗?验证 javadoc 的示例程序:List<Integer> li = Arrays.asList(1,2,3,45,678); final int v = 2;li.stream().filter(e-> e!=v).map(e->e).forEach(System.out::println);v= 5; 第v=5行的编译错误;, 明显地违反最终分配规则的示例片段:List<Integer> li = Arrays.asList(1,2,3,45,678); final int[] v = {2};li.stream().filter(e-> e!=v[0]).map(e->e).forEach(System.out::println);v[0]= 5;输出:345678上面的代码片段没有给出编译错误,我错过了什么吗?
1 回答

蓝山帝景
TA贡献1843条经验 获得超7个赞
在第一种情况下v
是 type 的变量int
,这里的 valuev
是 2 并且它是final
变量。当您尝试分配 5 时,它会给出错误,因为您无法更改变final
量值(按预期工作)。
谈到第二种情况,v
不是类型的变量int
,它是一个array
。在 Java 中,数组是对象,所以这里v
是一个参考。通常,引用是指一个对象并包含该对象的地址。当您尝试在v[0] = 5
这里更改对象内部的值而不是引用的值时。如果您尝试这样做v = new int[1]
,否则v={5}
您将收到编译错误
添加回答
举报
0/150
提交
取消