Java的forEach操作为啥要使用原子类?

image.png
哪位大佬解答一下,这里的forEach中关于sum的加法计算要使用原子类,不使用,编译器会报红?

阅读 5.1k
2 个回答

不是 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 ,尝试自己写一个解释器

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏