jdk1.8 中的 Lambda 表達式學習

Lambda 表達式在不少編程語言中都有 , 個人理解就是jdk1.8z中能夠將函數做爲參數傳遞了 , 並將代碼簡化了java

以排序爲例 編程

在老版本中是這樣寫的 : 編程語言

Integer[] array = new Integer[] {1,3,2} ;
Arrays.sort(array,new Comparator<Integer>() {
    public int compare(Integer a, Integer b) {
        return a-b;
    }
});
System.out.println("升序排序 : "+Arrays.toString(array));

輸出內容以下 :ide

升序排序 : [1, 2, 3]函數

 

是用 Lambda 表達式是這樣寫的測試

Integer[] array = new Integer[] {1,3,2} ;
Arrays.sort(array, (a,b)-> b-a);
System.out.println("降序排序 : "+Arrays.toString(array));

輸出內容以下 : spa

降序排序 : [3, 2, 1]code

 

Arrays.sort 這一句被大大簡化了

下面是我用本身的方法來一步步簡化演示 :對象

首先定義一個函數式接口 (即 : 這個接口中只有一個函數)blog

/**
 * 函數式接口 : 僅含有一個方法的接口
 */
public interface ISay {
    public String say(String msg) ;
}

 

而後定義一個方法來調用這個接口對象

(由於接口和接口中的方法一對一 , 咱們能夠理解成把這個方法做爲參數傳遞)

public static String doSay(String user,String msg ,ISay say) {
    return user + " : " + say.say(msg);
};

 

傳統的調用方式是這樣的

String str = doSay("老大","早上好!",new ISay(){
    @Override
    public String say(String msg) {
        return "【"+msg+"】" ;
    }
});

輸出內容以下 :

老大 : 【早上好!】

 

下面是有 lambda  表達式簡化

String str1 = doSay("張三","你好!",(ISay)(String msg)->{
    return "【"+msg+"】" ;
});
System.out.println(str1);

輸出內容以下 : 

張三 : 【你好!】

將接口中的方法頭簡化掉了 , (接口中只有一個方法,不用說也知道方法體對應的哪個方法)

將參數 (String msg) 保留着 , 由於方法體要調用參數

將 new 關鍵字也簡化掉了 , 接口又沒有帶參數的構造函數

 

進一步簡化以下 :

String str2 = doSay("李四","你好!",(msg)->{
    return "【"+msg+"】" ;
});
System.out.println(str2);

輸出結果以下 : 

李四 : 【你好!】

將參數類型簡化掉了 

將強轉類型  (ISay) 簡化掉了 ,  doSay 函數的第三個參數就是 ISay 類型 , 不用再強轉說明

 

繼續簡化

String str3 = doSay("王五","你也好!",(msg)->"【"+msg+"】");
System.out.println(str3);

輸出結果以下 : 

王五 : 【你也好!】

將方法體的大括號簡化掉了

將 return 關鍵字簡化掉了

 

最終簡化

String str4 = doSay("趙六","你也好啊!",msg->"【"+msg+"】");
System.out.println(str4);

輸出結果以下 :

趙六 : 【你也好啊!】

將 msg 外面的小括號簡化掉了

 


 

因此說 lambda 就是一個不斷將代碼簡化的過程 ;

口訣:左右遇一省括號,左側推斷類型省

完整代碼以下  ISay.java 和 Main.java

接口類 ISay.java  : 

/**
 * 函數式接口 : 僅含有一個方法的接口
 */
public interface ISay {
    public String say(String msg) ;
}

測試類 Main.java :

import java.util.Arrays;
import java.util.Comparator;

public class Main {

    public static void main(String[] args) {
        Integer[] array = new Integer[] {1,3,2} ;
        Arrays.sort(array,new Comparator<Integer>() {
            public int compare(Integer a, Integer b) {
                return a-b;
            }
        });
        System.out.println("升序排序 : "+Arrays.toString(array));
        
        String str = doSay("老大","早上好!",new ISay(){

            @Override
            public String say(String msg) {
                return "【"+msg+"】" ;
            }
        });
        System.out.println(str);
        
        //------------------ Lambda  表達式 -------------------//
        
        Arrays.sort(array, (a,b)-> b-a);
        System.out.println("降序排序 : "+Arrays.toString(array));
        
        String str1 = doSay("張三","你好!",(ISay)(String msg)->{
            return "【"+msg+"】" ;
        });
        System.out.println(str1);
        
        System.out.println("-------------------------------------------");
        
        String str2 = doSay("李四","你好!",(msg)->{
            return "【"+msg+"】" ;
        });
        System.out.println(str2);
        
        System.out.println("-------------------------------------------");
        
        String str3 = doSay("王五","你也好!",(msg)->"【"+msg+"】");
        System.out.println(str3);
        
        System.out.println("-------------------------------------------");
        
        String str4 = doSay("趙六","你也好啊!",msg->"【"+msg+"】");
        System.out.println(str4);
        
        System.out.println("end/:-)");
    }
    
    public static String doSay(String user,String msg ,ISay say) {
        return user + " : " + say.say(msg);
    };

}
相關文章
相關標籤/搜索