为什么lambda中使用for循环的变量还需要转换为final呢

img

上面必须修改为下面这样才是正确的,这是为什么呢? 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量?

img

在Java规范中提到

Any local variable, formal parameter, or exception parameter used but not declared in a lambda expression
must either be declared final or be effectively final (§4.12.4),
or a compile-time error occurs where the use is attempted.

大概意思是 Lambda 表达式中要用到的,但又未在 Lambda 表达式中声明的变量,必须声明为 final 或者是 effectively final,否则就会出现编译错误

简单说就是Lambda使用的局部变量,不希望是外部能修改,修改都是值的修改,这里的值是值传递,对于基本数据类型、包装类、String不可被修改内容,其他引用类型不能修改地址。

这个问题跟++有关系,由于是多线程环境,正常来说:
线程1拿到的i值是0
线程2拿到的i值是1
线程3拿到的i值是2
线程4拿到的i值是3
线程5拿到的i值是4

但是这是多线程环境,线程2不一定拿到的数据是1,因为i++和创建线程的前后顺序是不一定的。

lambda是匿名内部类, 如果和主线程运行时使用了不同的线程, 那么很有可能在主线程结束后, 局部变量已经销毁, 或者发生了更改, 那么就会导致实际使用和真实的是不一致的.