禿頭星人進化記(Lambda表示式學習總結)

fluoxetine~發表於2020-12-03

使用背景

原因:
(1):避免匿名內部類定義過多
(2):簡化程式碼量
(3):去雜留核
其實質屬於函數語言程式設計。
函式式介面:任何介面,如果介面中只含有一個抽象方法,那麼他就是一個函式式介面。可以通過lambda表示式來建立介面的物件
例如: 執行緒中的Runnable介面:

 public interface Runnable {
	//只有一個抽象方法
    public abstract void run();
}

引出Lambda表示式

1:必須存在一個函式式介面
2:起初使用成員內部類
3:簡化->靜態內部類
4:簡化->區域性內部類
5:簡化->匿名內部類
6:簡化->Lambda表示式:相比於匿名內部類,由於介面名和方法名唯一不變就將其省略:…new Ilike() {
@Override
public void lambda… 省略這些後加上一個”->“即可。

總程式碼如下(示例):

public class LambdaTest {

    //3:簡化->靜態內部類
    static class like2 implements Ilike{
        @Override
        public void lambda() {
            System.out.println("i like lambda2");
        }
    }

    public static void main(String[] args) {
        Ilike ilike=new like();
        ilike.lambda();

        new like2().lambda();

        //4:簡化->區域性內部類
        class like3 implements Ilike{
            @Override
            public void lambda() {
                System.out.println("i like lambda3");
            }
        }
        new like3().lambda();

        //5:簡化->匿名內部類,沒有名字,但是必須藉助介面或者父類
        Ilike like4 = new Ilike() {
            @Override
            public void lambda() {
                System.out.println("i like lambda4");
            }
        };
        like4.lambda();

        //6:簡化->lambda表示式  相當於省去了
        Ilike like5 = () -> {
            System.out.println("i like lambda5!!!!!!!");
        };
        like5.lambda();
    }


}

//1:定義一個函式式介面
interface Ilike{
    void lambda();

}

//2:定義介面實現類
class like implements Ilike{
    @Override
    public void lambda() {
        System.out.println("i like lambda!!!");
    }
}

再次簡化Lambda表示式

1:之前通過內部類一步步簡化到初始形態的Lambda表示式可以根據情況再次簡化
2:這次嘗試帶引數的抽象方法
3:還是得先定義函式式介面
4:初始形態
5:一級簡化:引數前面型別可省略,多個引數不同型別也可以省略,用逗號隔開即可
6:二級簡化:引數兩邊的小括號亦可省略,但是多個引數的話就不能省略了

//String name ,int age型別可以省略,括號不能去!!!
ilove=(name,age) -> {
            System.out.println("I LOVE you"+age+name);
        };

7:三級簡化:程式碼行兩邊的大括號也可省略,但是多行程式碼的話就不能省略了

ilove=name -> {
            System.out.println("I LOVE you"+name);
            System.out.println("I LOVE you"+name);
            System.out.println("I LOVE you"+name);
            //這樣大括號就不能省略了!!!
        };

總程式碼如下(示例):

//嘗試帶引數的抽象方法 並一步一步簡化
public class LambdaTest2 {
    public static void main(String[] args) {
        Ilove ilove=null;
        //初始lambda
        ilove=(String name)->{
            System.out.println("I Love you"+name);
        };
        ilove.mylove("zhao you");

        //一級簡化  如果是多個引數 不管型別是否相同 都可以省掉型別
        ilove=(name) -> {
            System.out.println("I LOVE you"+name);
        };
        ilove.mylove("gao lan ling");

        //二級簡化 如果是多個引數 則不能去掉括號
        ilove=name -> {
            System.out.println("I LOVE you"+name);
        };
        ilove.mylove("lan ling");

        //三級簡化 如果式多行程式碼命令 則不能去掉大括號
        ilove=name -> System.out.println("I LOVE you"+name);
        ilove.mylove("ling");
    }

}



//定義函式式介面
interface Ilove{
    void mylove(String name);
}

總結

之前一直不知道Lambda表示式是啥,通過一次執行緒的學習意外學到了lambda的基本使用,若有錯誤,煩請大佬指教。

相關文章