哪位大佬解答一下,这里的forEach中关于sum的加法计算要使用原子类,不使用,编译器会报红?
因为闭包的缘故会出现变量名在不同作用域重复定义,在闭包中定义的值变量与外部作用域的值变量不是同一个(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 ,尝试自己写一个解释器
12 回答5.7k 阅读
2 回答3.2k 阅读✓ 已解决
3 回答6.9k 阅读✓ 已解决
3 回答3k 阅读✓ 已解决
5 回答4.6k 阅读
4 回答2.2k 阅读
3 回答4.2k 阅读
不是 forEach 的问题,而是 Lambda 闭包的问题。
不是非得用 AtomicInteger,你自定义一个包装类型也可以。