Java:从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量

报错Case

Lambda表达式对dest添加对象,后续对dest变量修改(非内容修改),报错!

List<String> dest = new ArrayList<>();
List<String> src = new ArrayList<>(Arrays.asList("01", "02", "03"));
src.forEach(item -> {
    dest.add("dest: " + item);
});
dest = null;

问题分析

Lambda表达式规则

  • 只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
  • 局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
  • 不允许声明一个与局部变量同名的参数或者局部变量。

由Lambda表达式规则第二条可知,局部变量dest为隐性final!

总结

Lambda表达式引用的局部变量无论是否声明final,均具有final特性!表达式内仅允许对变量引用(引用内部修改除外,比如list增删),禁止修改!
以下情况均不允许编译通过:
情况一:修改外部局部变量

 int n = 0;
 src.forEach(item -> {
     n = 3;
     dest.add("dest: " + item);
 });

情况二:Lambda使用外部局部变量,变量隐性final!

int n = 0;
src.forEach(item -> {
    dest.add("dest: " + item + n);
});
n = 0;

情况三:声明外部局部变量同名参数

int n = 0;
src.forEach(n -> {
    dest.add("dest: " + n);
});
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值