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); }; }