java8新特性-lambda表示式
阿新 • • 發佈:2021-07-01
關於lambda表示式,它的本質就是匿名內部類一種。
複習一下匿名內部類
使用場景:當類或介面型別作為引數傳遞時,可以直接使用匿名內部類方式建立對應的物件
匿名內部類的巢狀使用
參考這篇:https://blog.csdn.net/u013771764/article/details/82937903
使用Lambda表示式簡化匿名內部類的書寫,但Lambda表示式並不能取代所有的匿名內部類,只能用來取代函式介面(Functional Interface)的簡寫。
能夠使用Lambda的依據是必須有相應的函式介面(函式介面,是指內部只有一個抽象方法的介面)。
@FunctionalInterface 檢查是否是函式式介面
lambda表示式省略了介面名和函式名
public class Test { interface Fun{ void say();//介面中的抽象方法abstract 可以省略 } public static void main(String[] args) { Test test = new Test(); test.play();
//lambda表示式 Fun fun = () -> System.out.println("3"); fun.say(); }public void play(){ //匿名內部類 Fun f=new Fun(){ @Override public void say() { System.out.println("f"); } }; f.say(); } }
上面是無參函式簡寫,如果是有參函式:
(引數列表)->{return 返回值}
可以省略引數列表的型別編譯器可以統一識別引數值。
public class Test {interface Fun{ void say(int x,int y);//介面中的抽象方法abstract 可以省略 } public static void main(String[] args) { Fun fun = (x,y) -> { x=x+y; y=2*x; System.out.println("x="+x+",y="+y);}; fun.say(3,4); } }
lambda中可以使用成員變數,區域性變數,但是使用過區域性變數以後,該區域性變數就必須為final,所以不能再修改了。
(1)不需要宣告引數型別,編譯器可以統一識別引數值。
(2)一個引數無需定義圓括號,但多個引數需要定義圓括號。
(3)lambda 表示式的區域性變數可以不用宣告為 final,但是必須不可被後面的程式碼修改
(4)在lambda表示式不允許宣告與全域性變數相同的區域性變數、引數
public static void main(String[] args) { Test test = new Test(); test.play(); int a=3; Fun fun2 = () -> System.out.println(a+5); fun2.say(); a=5;//編譯會報錯 }