如何在lambda内部修改外部局部变量的值/如何用lambda重构for循环计数

Talk is cheap, show me your code!


看一段代码:

 

/**
 * 在lambda表达式内部,修改lambda表达式外部的局部变量的值
 */
private synchronized void updateLocalVariable() {

    List<String> list = new ArrayList<>();
    list.add("444");
    list.add("4444");

    int count = 0;
    // 这样写会报错。Local variable result defined in an enclosing scope must be final or effectively final
    list.stream().forEach(str -> System.out.println("当前是第" + (count++) + "次循环" + str));
}

 

如果你试图在lambda表达式内部修改外部局部变量的值,请注意,这里的2个限定条件:
1,count在lambda外部。
2,count是局部变量。

那么jvm会无情的告诉你:
Local variable result defined in an enclosing scope must be final or effectively final


原因其实也很简单,本质上就是因为lambda表达式在方法内部,那么lambda表达式的内存分配就是在栈上。栈内存不存在线程安全问题,因为栈内存存的都是变量的副本。
对于局部变量count而言,它的生命周期就是所在方法的生命周期。这就决定了count无法被位于同一个栈帧上的lambda修改,因为这种修改毫无意义,
你无法将你的修改传递出当前栈帧。栈内存不会被共享,也就意味着你没有权利和其他栈帧通信。

如果非要在lambda内部修改lambda表达式外部的局部变量的值呢

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值