lambda運算式中的變數:
需求1:建立一個方法,在方法中開一個線程,線上程中輸出3個“helloWord”
1.普通的寫法:
public static void main(String[] args) { printHello("HelloWord",3); } -------------------------------------------- //參數底層使用的都加了final修飾 public static void printHello(String name,int count){ //在這裡定義的變數,底層也是加了final修飾 String ch="!"; new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < count; i++) { //為什麼內部類可以直接使用外部類額變數。。。。。 System.out.println(i+name+ch); } System.out.println(this);//列印內部類對象的地址,這個this代表是內部類的this,因為這個是靜態方法,外部類對象不存在 } }).start(); } ------------------------------------------- 輸出結果: 0HelloWord! 1HelloWord! 2HelloWord! 3HelloWord! 4HelloWord! lambada.TestLambda$1@2980e8cb //這個是內部類
2.反編譯上面printHello()方法:
//參數底層使用的都加了final修飾 public static void printHello(final String name, final int count) { //在這裡定義的變數,底層也是加了final修飾 final String ch = "!"; (new Thread(new Runnable() { private final int val$count; private final String val$name; private final String val$ch; public void run() { for (int i = 0; i < count; i++) System.out.println((new StringBuilder(String.valueOf(i))).append(name).append(ch).toString()); System.out.println(this); } { count = i; name = s; ch = s1; super(); } })).start(); }
反編譯printHello()方法,可以知道:
1.printHello()的參數底層使用的都加了final修飾
2.在printHello()中定義的變數也加了final修飾
3.this是指向,內部類的this
2.lambda運算式的寫法:
public static void main(String[] args) { new TestLambda().printHello("HelloWord",3); } --------------------------------------------- //參數的在底層被fianl修飾,所以可以在lambda運算式中可以直接使用該自由變數 public void printHello(String name,int count){ //在這裡定義的局部變數,底層也是加了final修飾 String ch="!"; new Thread(()->{ for (int i = 0; i < count; i++) { System.out.println(i+name+ch); } System.out.println(this);//這個this不是內部類的this,而是外部類的this } ).start(); } ------------------------------------------- 輸出結果: 0HelloWord! 1HelloWord! 2HelloWord! lambada.TestLambda@663a8ec8 //這個是外部類
從列印的結果可以知道:
1.printHello()的參數底層使用的都加了final修飾
2.在printHello()中定義的變數也加了final修飾
3.在lambda中的this是指向,建立lambda運算式的方法中的this,而不是內部類的this lambda運算式中變數的3種類型:
1.參數//例如:運算式中的(User o1,User o2)參數2.局部變數//例如:方法中定義的變數3.自由變數(不是參數也不是局部變數)//例如:方法中的參數
總結:
結論:1.lambda運算式中的自由變數會被儲存,無論什麼時候執行lambda運算式,都可以直接使用;2.自由變數在lambda運算式中是不能修改的,因為自由變數是被final修飾3.參數和局部變數的使用方式和普通的使用方式相同;4.lambda運算式中的this指向,建立lambda運算式的方法中的this,而不是內部類的this