比如,想在foreach这个循环中,来更新lambda表达式外面的一个变量,此时会报错 variable used in lambda expression should be final or effictively final 。
没错,我们知道在Java中,是不允许在lambda还有匿名内部类中使用 非final 类型的变量。
( 对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用。对于上面的实例,如果我们需要对test()方法里面内部类进行多次使用,建议重新定义类,而不是使用匿名内部类。)
简单来说明下原因就是:
The restriction to effectively final variables prohibits access to dynamically-changing local variables, whose capture would likely introduce concurrency problems.
能够避免局部变量的改变,进而可能会导致并发问题的出现。