使用lambda表达式出现Variable used in lambda expression should be final or effectively final

使用lambda表达式出现Variable used in lambda expression should be final or effectively final

为什么要限制我们直接使用外部的局部变量呢?

主要原因在于内存模型,我们都知道实例变量在堆上分配的,而局部变量在栈上进行分配,lambda 表达式运行在一个独立的线程中,局部变量也属于线程私有,如果肆意的允许 lambda 表达式引用局部变量,可能会存在局部变量以及所属的线程被回收,而 lambda 表达式所在的线程却无从知晓,这个时候去访问就会出现错误,之所以允许引用事实上的 final(没有被声明为 final,但是实际中不存在更改变量值的逻辑),是因为对于该变量操作的是变量副本(与匿名内部类原理一致),只有变量值不会被更改,这份副本才有效。

上一篇:Oracle如何预估将要创建的索引的大小


下一篇:2021-04-25