Lambda捕获与非捕获

Ste*_*ven 4 java lambda java-8 method-reference

你能解释为什么第一个lambda正在捕获而第二个没有捕获.

   Runnable createLambdaWithCapture() {
      return System.out::println;
   }    
   Runnable createLambdaWithApparentCapture() {
        return () -> System.out.println();
   }
Run Code Online (Sandbox Code Playgroud)

Sav*_*ior 6

第一个片段正在捕获,因为它会评估语句System.out何时return执行,并捕获要在其Runnable#run实现中使用的相应对象引用.

第二个片段生成一个Runnable未捕获的实例,因为System.out只有run在调用该实例的方法时才会对其进行评估.自return语句执行以来,它可能已经发生了变化.