Lambda表达式与局部变量

517 阅读1分钟

首先来看一段代码

    private void localVarOnce(){
        int count = 0;
        Runnable runnable = () -> System.out.println(count);
    }

在上面这段代码中,lambda可以访问到局部变量count,但是其实,lambda与局部变量之间的关系还是存在一些限制的。 再来看一段代码

    private void localVarTwice(){
        int count = 0;
        Runnable runnable = () -> System.out.println(count);
        count = 2;
    }

这段代码如果写在idea上的时候,可以在第二个count上看到红线,并且会出现以下提示:

    Variable used in lambda expression should be final or effectively final

也就是说,局部变量需要显示的被声明为final或者在事实上是不可变的

原因: 局部变量位于栈上,lambda运行于一个线程当中,如果这个时候lambda去访问变量的时候,持有该变量的线程将其回收,就会出现问题。

参考:java实战(第二版)