Java的forEach操作为啥要使用原子类?
哪位大佬解答一下,这里的forEach中关于sum的加法计算要使用原子类,不使用,编译器会报红?
回答:
不是 forEach 的问题,而是 Lambda 闭包的问题。
不是非得用 AtomicInteger,你自定义一个包装类型也可以。
REF: https://www.zhihu.com/questio...
回答:
因为闭包的缘故会出现变量名在不同作用域重复定义,在闭包中定义的值变量与外部作用域的值变量不是同一个(copy 值),而引用(copy引用)不存在这个问题,其实还是引用类型还是值类型,为了语法一致性引入了final 进行修饰从而降低编写者的心智负担,本质上还是作用域+同名变量会 导致歧义
如
int v = 1;()->{v=0}
for(xxx){v=0}
两者对v的赋值,一个是内部类里面定义了个v 一个是对外部v的赋值
函数里面的v=0是 定义变量并赋值 , for里面的v=0是赋值
符合原语义的写法应该是
int v = 1()->{int v = 0}
for(xxx){v = 0}
显然这里做了语法糖的处理,然后让使用者差异为什么要用final修饰?
扩展:
对于这个问题如果感兴趣可以学一下 rust 对生命周期会有一个更好的理解
若在想深入些可以去看sicp ,尝试自己写一个解释器
以上是 Java的forEach操作为啥要使用原子类? 的全部内容, 来源链接: utcz.com/p/944643.html