Lambda表達式,簡化你的內部類


1. 函數式編程思想

面向對象的思想:

  • 做—件事情,找一個能解決這個事情的對象,調用對象的方法完成

函數式編程思想:

  • 只要能獲取到想要的結果,誰去做的怎麼做的都不重要,重視的是結果不重視過程

2. Lambda表達式引入

爲什麼要使用Lambda表達式?

  • 避免匿名內部類定義過多

  • 讓代碼實現相同的邏輯看起來更加簡潔

函數式接口: 接口中只包含唯一一個抽象方法,那麼就是函數式接口

例如:

public interface Runnable {
    public abstract void run();
}

Lambda是JDK8引入的新特性函數式接口是Lambda表達式的關鍵所在

有了函數式接口,我們就可以通過 lambda表達式來創建該接口的對象。

通常情況下,對於一個接口及實現類,我們都會這麼寫:

interface Lambda {
    void lambda();
}

class MyLambda implements Lambda {

    @Override
    public void lambda() {
        System.out.println("學習lambda表達式...");
    }
}

public class LambdaLearn {
    public static void main(String[] args) {
        Lambda lb = new MyLambda();
        lb.lambda();
    }
}

學習lambda表達式…

我們需要寫三個類來實現接口,用函數式編程來看待帶的話就會顯得很繁瑣。於是,我們可以通過內部類來改進:

還好面試官還沒問,趕緊把【內部類】的知識點補上

改進一:靜態內部類

MyLambda類中的代碼放到LambdaLeadn中,變爲靜態內部類

interface Lambda {
    void lambda();
}

public class LambdaLearn {

    //靜態內部類
    static class MyLambda implements Lambda {
        @Override
        public void lambda() {
            System.out.println("學習lambda表達式...");
        }
    }
    
    public static void main(String[] args) {
        Lambda lb = new MyLambda();
        lb.lambda();
    }
}

學習lambda表達式…

然後,繼續簡化

改進二:成員內部類

MyLambda變爲成員內部類

interface Lambda {
    void lambda();
}

public class LambdaLearn {
    public static void main(String[] args) {
        //成員內部類
        class MyLambda implements Lambda {
            @Override
            public void lambda() {
                System.out.println("學習lambda表達式...");
            }
        }

        Lambda lb = new MyLambda();
        lb.lambda();
    }
}

再試試,還能簡化?

改進三:匿名內部類

直接通過匿名內部類來實現接口

interface Lambda {
    void lambda();
}

public class LambdaLearn {
    public static void main(String[] args) {
        //成員內部類
        new Lambda() {
            @Override
            public void lambda() {
                System.out.println("學習lambda表達式...");
            }
        }.lambda();
    }
}

通過內部類的三次改進,實現同樣的功能我們簡化了代碼。但是,如果匿名內部類定義了很多,功能實現了,但是代碼讀不懂了。於是,我們在此基礎上引入了lambda表達式

lambda表達式推倒

interface Lambda {
    void lambda();
}

public class LambdaLearn {
    public static void main(String[] args) {
        Lambda lb = () -> {
            System.out.println("學習lambda表達式...");
        };
        lb.lambda();
    }
}

語義分析

  • 前面的一對小括號即lambda方法的參數(無),代表不需要任何條件;

  • 中間的一個箭頭->代表將前面的參數傳遞給後面的代碼;

  • 後面{}中的代碼爲重寫接口中抽象方法的方法體

那,lambda還能不能再簡化了?

3. lambda表達式簡化

簡化參數類型

定義一個有參的lambda表達式來簡化

interface Lambda {
    void lambda(String str);
}

public class Simplify {
    public static void main(String[] args) {
        Lambda lb = (String str) -> {
            System.out.println(str);
        };
        lb.lambda("lambda表達式");
    }
}
  • 簡化參數類型

  • 簡化括號

  • 簡化代碼塊{ }

如果是多個參數則不能簡化

Lambda表達式實現Runnable接口

public class LThread {
    public static void main(String[] args) {
        //使用匿名內部類實現多線程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("線程" + Thread.currentThread().getName() + "創建了");
            }
        }).start();

        //lambda實現多線程
        new Thread(()-> {
                System.out.println("線程" + Thread.currentThread().getName() + "創建了");
            }
        ).start();
    }
}

線程Thread-0創建了
線程Thread-1創建了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章