为什么lambda里面要访问局部变量必须是final

 MappedFile mappedFile = mappedFiles.get(current);
       
   ....
            msgMap.forEach((k, v) -> {
        
                 ....
                        mappedFile.appendData(byteBuffer);
                   
            });

这个forEach是一个lambda表达式,实际上是一个匿名内部类, 这里访问mappedFile的时候,必须要求mappedFile是被final修饰 这是为什么?

首先,mappedFile是外部类的某个方法的局部变量
然后 forEach是一个lambda表达式,本质上是一个匿名内部类
所有的匿名内部类持有有外部类的对象实例引用。

于是问题就转换成了,匿名内部类能访问外部类方法的局部变量吗? 答案是不行,即使有外部类的引用,也无法访问到外部类方法里面的局部变量。

因此,外部类的局部变量,就只能通过匿名内部类的构造方法传进去。

这就会出现一个问题,如果外部类修改了这个变量的引用,内部类无法知道,内部类修改了这个变量,外部类也不知道,所以干脆就final了,谁也不许改,就不会出现这个问题。

你可能感兴趣的:(java)