Lambda作用域:
在Lambda表達式中訪問外層作用域和老版本的匿名對象中的方式很相似。可以直接訪問標記了final的外層局部變量,或者實例的字段以及靜態變量。但是如果訪問局部變量,要求局部變量必須是final修飾的。
注意:上面代碼中,一旦匿名內部類中使用了i,則i會自動被編排為final的。
首先我們來看下使用匿名內部類是如何實現的:
package com.test.cgb; public class CryptonymInnerTest { public static void main(String[] args) { int i = 9; // CryptonymInnerInterface m1 = new CryptonymInnerInterface() { @Override public int sum(int num1 , int num2) { System.out.println(i); return num1 + num2; } }; m1.sum(123, 456); } }
打印結果為9
如何證明i是被final修飾的:
下面使用Lambda表達式實現如下:
public class CryptonymInnerTest { public static void main(String[] args) { // 使用Lambda表達式 int i = 9; CryptonymInnerInterface m1 = (num1, num2) -> { System.out.println(i); return num1 + num2; }; m1.sum(123, 456); } }