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

回到顶部