1. 程式人生 > 其它 >java複習筆記--Lambda表示式

java複習筆記--Lambda表示式

技術標籤:javajavalambda

Lambda表示式

函數語言程式設計思想概述

函式式思想則儘量忽略面向物件的複雜語法:“強調做什麼,而不是以什麼形式去做”
而我們要學習的Lambda表示式就是函式式思想的體現

Lambda表示式的標準格式

格式:
(形式引數) -> {程式碼塊}
形式引數:如果有多個引數,引數之間用逗號隔開;如果沒有引數,留空即可
-
>:由英文中畫線和大於符號組成,固定寫法。代表指向動作 程式碼塊:是我們具體要做的事情,也就是以前我們寫的方法體內容

Lambda表示式的使用前提

有一個介面
介面中有且僅有一個抽象方法

體驗Lambda表示式

啟動一個執行緒

實現方式一
實現步驟

定義一個類MyRunnable實現Runnable介面,重寫run()方法
建立MyRunnable類的物件
建立Thread類的物件,把MyRunnable的物件作為構造引數傳遞
啟動執行緒
public class myrunnable implements  Runnable{

    @Override
    public void
run() { System.out.println("實現介面的方式"); } } public class myrunnabletest { public static void main(String[] args) { myrunnable my = new myrunnable(); Thread t1=new Thread(my); t1.start(); //實現介面的方式 } }

實現方式二
匿名內部類

public class myrunnabletest {
    public
static void main(String[] args) { Thread t1=new Thread(new Runnable() { @Override public void run() { System.out.println("匿名內部類的方式"); } }); t1.start(); //匿名內部類的方式 } }

實現方式三
Lambda表示式

public class myrunnabletest {
    public static void main(String[] args) {

        Thread t1=new Thread(()->{
            System.out.println("Lambda表示式");
        }
            );
        t1.start(); //Lambda表示式

    }
}

無參無返回值抽象方法的練習

public class flydemo {

    public static void main(String[] args) {
         //1
        flyable f=new flyImpl();
        useflyable(f);

        //2
        useflyable(new flyable() {
            @Override
            public void fly() {
                System.out.println("我會飛");
            }
        });

        //3
        useflyable(()->{
            System.out.println("我會飛");
        });
    }


    public static void useflyable(flyable f){
        f.fly();
    }
}

有參無返回值抽象方法的練習

public class flydemo {

    public static void main(String[] args) {
         //1
        flyable f=new flyImpl();
        useflyable(f);

        //2
       useflyable(new flyable() {
           @Override
           public void fly(String name, String o) {
               System.out.println("我是"+name+"會飛,飛的比"+o+"快");
           }
       });

        //3
        useflyable((String name,String o)->{
            System.out.println("我是"+name+"會飛,飛的比"+o+"快");
        });
    }


    public static void useflyable(flyable f){
        f.fly("dyk","飛機");
    }
}

有參有返回值抽象方法的練習

public class flydemo {

    public static void main(String[] args) {
         //1
        flyable f=new flyImpl();
        useflyable(f);

        //2
       useflyable(new flyable() {
           @Override
           public int add(int a, int b) {
               return a+b;
           }
       });

        //3
        useflyable((int a,int b)->{

            return  a+b;
        });
    }


    public static void useflyable(flyable f){
        int sum=f.add(1,2);
        System.out.println("和為:"+sum);
    }
}

Lambda表示式的省略模式

省略的規則

引數型別可以省略。但是有多個引數的情況下,不能只省略一個
如果引數有且僅有一個,那麼小括號可以省略
如果程式碼塊的語句只有一條,可以省略大括號和分號,如果有returnreturn也要省略掉

引數型別可以省略。但是有多個引數的情況下,不能只省略一個

public class flydemo {

    public static void main(String[] args) {
        
        //引數的型別可以省略
        useflyable(( a,b)->{

            return  a+b;
        });
    }


    public static void useflyable(flyable f){
        int sum=f.add(1,2);
        System.out.println("和為:"+sum);
    }
}

如果只省略一個會報錯

如果引數有且僅有一個,那麼小括號可以省略

public class flydemo {

    public static void main(String[] args) {

        //如果引數有且僅有一個,那麼小括號可以省略
        useflyable(a->{

            return  a+2;
        });
    }


    public static void useflyable(flyable f){
        int sum=f.add(1);
        System.out.println("和為:"+sum);
    }
}

如果程式碼塊的語句只有一條,可以省略大括號和分號,和return關鍵字

public class flydemo {

    public static void main(String[] args) {

        //3
       useflyable(a->a+2);
    }


    public static void useflyable(flyable f){
        int sum=f.add(1);
        System.out.println("和為:"+sum);
    }
}

Lambda表示式的注意事項

使用Lambda必須要有介面,並且要求介面中有且僅有一個抽象方法

必須有上下文環境,才能推匯出Lambda對應的介面
根據區域性變數的賦值得知Lambda對應的介面
Runnable r = () -> System.out.println("Lambda表示式");

根據呼叫方法的引數得知Lambda對應的介面
new Thread(() -> System.out.println("Lambda表示式")).start();

Lambda表示式和匿名內部類的區別

所需型別不同
匿名內部類:可以是介面,也可以是抽象類,還可以是具體類
Lambda表示式:只能是介面

使用限制不同
如果介面中有且僅有一個抽象方法,可以使用Lambda表示式,也可以使用匿名內部類
如果介面中多於一個抽象方法,只能使用匿名內部類,而不能使用Lambda表示式

實現原理不同
匿名內部類:編譯之後,產生一個單獨的.class位元組碼檔案
Lambda表示式:編譯之後,沒有一個單獨的.class位元組碼檔案。對應的位元組碼會在執行的時候動態生成