1. 程式人生 > >從委託到 lambda 表示式介紹(為什麼需要 lambda 表示式)

從委託到 lambda 表示式介紹(為什麼需要 lambda 表示式)

接下來,筆者將以簡單的說話方式向你介紹java8的新特性,lambda表示式。

用最簡單的方式告訴你為什麼需要 lambda 表示式

簡單地來解釋委託,就是“把方法作為引數傳遞”。

歷史來源:

有時候需要傳入一段程式碼到程式的方法中。
如:

public class MainClass(){
    public static final void test(){
        if(true){
            //執行一段經常修改的程式碼
            //王奶奶去了劉奶奶家送牛奶
            //……
            //王奶奶回家
}else if{ //什麼都不執行 } } }

出於某種原因,if 中的程式碼必須頻繁修改。
這個時候就需要把方法寫在物件的方法中,然後把物件傳入到程式中呼叫對應的方法。(重構)

public class MainClass(){
    public static final void test(MilkSender c){
        if(true){
            c.sendMilk();
        }else if{
            //什麼都不執行
        }
    }
}
public
class MilkSender (){ public void sendMilk(){ //執行一段經常修改的程式碼 //王奶奶去了劉奶奶家送牛奶 //…… //王奶奶回家 } } MainClass.test(new MilkSender());

這個時候我們不需要硬編碼地修改 test 中的程式碼,就可以達到 “在方法中執行自定義編碼” 的效果。
不過現在,我們只需要MyClass物件中的一個方法而已,把整個MyClass物件都傳進去,顯得有些亂,
有沒有什麼方法能讓我們只傳入一個方法呢?
答案是有的:傳入一個介面即可。

public static final void test(MyClassInterface c){
    if(true){
        c.doSomething();
    }
}

public interface MyClassInterface (){
    public void doSomething();
}

這種形式的編碼我們暫時稱為方法委託。(因為這種叫法來源於C/C++)

這樣做以後,每次都可以直接建立“匿名物件”

MainClass.test(new MyClass(){
    @Override
    public void doSomething(){
        System.out.println("good1");
    }
);
MainClass.test(new MyClass(){
    @Override
    public void doSomething(){
        System.out.println("good2");
    }
);

這種形式的編碼,我們稱為匿名物件編碼。

嗯,稍微好看點了,但是看起來還是很不舒服:

有時候只是需要一句程式碼,卻寫了至少5行的程式碼。(帶來了可讀性與“高度”問題)
所以為了解決“高度問題”,我們引入lambda表示式。

public void main(String[] args){
    DamnedDesigner.test(()->System.out.println("good1"));
    DamnedDesigner.test(()->System.out.println("good2"));
}

原來冗長的程式碼一下子變得清晰、簡潔、快速。

lambda表示式不僅僅用於Java,也應用於C#、C++等常用程式語言。
lambda表示式是java8最大的亮點。(咳咳,雖然落後了十年左右才開始)。
java8在國內雖然普及率相當低,但是筆者相信這將無法避免地成為未來的趨勢。

你已經瞭解到:方法委託是啥,匿名物件是啥,lambda表示式是啥。
(你問我lambda表示式實用嗎,那就厲害了!)
lambda表示式具體介紹請看下篇。