根据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;
输出:
3
45
678
上面的代码片段没有给出编译错误,我错过了什么吗?
蓝山帝景
相关分类