为了账号安全,请及时绑定邮箱和手机立即绑定

数组作为局部变量 - 不要遵循 Lambda 中的明确赋值规则

数组作为局部变量 - 不要遵循 Lambda 中的明确赋值规则

MM们 2022-06-15 15:28:27
根据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}您将收到编译错误


查看完整回答
反对 回复 2022-06-15
  • 1 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号