1. 程式人生 > 其它 >java8新特性-lambda表示式

java8新特性-lambda表示式

關於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;//編譯會報錯
    }