当前位置:   article > 正文

Lambda表达式下访问外部变量_lambda表达式里面怎么用外部变量

lambda表达式里面怎么用外部变量

Lambda表达式可以访问给它传递的变量,访问自己内部定义的变量,同时也能访问它外部的变量。

不过lambda表达式访问外部变量有一个非常重要的限制

变量不可变(只是引用不可变,而不是真正的不可变)

遇到问题:

有同学反馈Stream循环处理集合时,可能需要操作一个中间变量进行复制或者比较操作。做了一个简单的示例如下:

(例子)统计取模2的数量

在这里插入图片描述
会提示(封闭范围中定义的局部变量a必须是final或effectively final):
在这里插入图片描述
当我们加入final进行变量修饰(无法分配最终的局部变量A):
在这里插入图片描述

原因

不过lambda表达式访问外部变量有一个非常重要的限制:变量不可变(只是引用不可变,而不是真正的不可变)。

解决方案

java.util.concurrent.atomic.*

AtomicInteger说明

AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。

AtomicReference说明:

它是通过"volatile"和"Unsafe提供的CAS函数实现"原子操作。
1.value是volatile类型。这保证了:当某线程修改value的值时,其他线程看到的value值都是最新的value值,即修改之后的volatile的值。
2. 通过CAS设置value。这保证了:当某线程池通过CAS函数(如compareAndSet函数)设置value时,它的操作是原子的,即线程在操作value时不会被中断。
在这里插入图片描述

扩展


a.incrementAndGet(); //前者,先+1,再返回
a.get()//获取当前a的值
a.getAndIncrement()//后者,先返回,再 +1
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/507663
推荐阅读
相关标签
  

闽ICP备14008679号