Lambda表示式
Lambda表示式
初識lambda
Lambda表示式是Java8的新特性,採用的思想是函數語言程式設計的思想。也就是 強調做什麼,而不是怎麼做 。
先來看一個例子
1 public class LambdaTest01 { 2public static void main(String[] args) { 3Runnable runnable = new Runnable() { 4@Override 5//重寫run方法 6public void run() { 7System.out.println("重寫run方法"); 8} 9}; 10//啟動執行緒 11new Thread(runnable).start(); 12} 13 }
對以上程式碼進行分析,首先Thread需要一個runnable介面的物件作為引數傳遞進來,其中傳入的runnable介面物件的run方法是實際執行的業務操作。
在這段程式碼中,為了實現run()的邏輯操作,我們必須有Runnable的實現類,從而不得不實現(重寫)run方法,然後就使用了匿名內部類。
但是我們只關注這段方法究竟做了什麼邏輯操作,這個才是個我們關心的重點。
以下我們藉助java8的特性Lambda表示式來看一下,如何簡化以上操作:
1 public class LambdaTest02 { 2 3public static void main(String[] args) { 4 5//(引數型別引數名稱) ->{ 程式碼語句 } 6new Thread(()-> System.out.println("執行緒開始執行")).start(); 7 8} 9 }
對比示例1和示例2,可以看出lambda表示式帶來的簡便。
Lambda表示式標準格式
Lambda由三個部分組成
1.引數 2.一個箭頭3.一段程式碼
Lambda表示式的標準格式為:
(引數型別引數名稱) ->{ 程式碼語句 }
格式說明:
-
小括號內是引數型別和引數名稱,如果沒有引數,可以什麼都不寫,多個引數則用逗號分隔
-
->
是lambda表示式新引進d的語法格式,代表指向操作 -
大括號與傳統的程式碼 一樣,寫具體實現。
Lambda表示式無參無返回值
給定一個介面Game
1 public interface Game { 2 void playGame(); 3 }
使用lambda表示式輸出"玩遊戲了"
1 public class LambdaTest3 { 2public static void main(String[] args) { 3invokeGame(()->{ 4System.out.println("玩遊戲了"); 5}); 6} 7 8public static void invokeGame(Game game){ 9game.playGame(); 10} 11 }
Lambda的引數和返回值
以
java.util.Comparator<T>
介面為例:
其中抽象方法為:
public abstract int compare(T o1,T o2);
使用lambda表示式對人物角色排序
1 public class Person { 2private String name; 3private int age; 4 5public Person() { 6} 7 8public Person(String name, int age) { 9this.name = name; 10this.age = age; 11} 12 13public String getName() { 14return name; 15} 16 17public void setName(String name) { 18this.name = name; 19} 20 21public int getAge() { 22return age; 23} 24 25public void setAge(int age) { 26this.age = age; 27} 28 29@Override 30public String toString() { 31return "Person{" + 32"name='" + name + '\'' + 33", age=" + age + 34'}'; 35} 36 }
排序
1 public class LambdaTest04 { 2public static void main(String[] args) { 3Person []person ={ 4new Person("好運姐",24), 5new Person("阿狸",19), 6new Person("拉克絲",16) 7}; 8 9Arrays.sort(person,(Person p1,Person p2)->{ 10return p1.getAge()-p2.getAge(); 11}); 12 13for (Person p : person) { 14System.out.println(p); 15} 16} 17 }
Lambda表示式有參有返回值
計算器介面
1 public interface Calculator { 2int calc(int a,int b); 3 } 4
實現
1 public class LambdaTest05 { 2public static void main(String[] args) { 3 4invokeCalc(3,6,(int a ,int b)->{ 5 6return a+b; 7}); 8} 9private static int invokeCalc(int a,int b,Calculator calculator){ 10 11int result = calculator.calc(a, b); 12System.out.println("結果是:"+result); 13return result; 14} 15 }
Lambda的省略格式
省略規則
-
小括號內參數型別可以省略;
-
如果小括號內有且只有一個引數,則小括號可以省略
-
如果大括號只有且僅有一個語句,則無論有無返回值,都可以省略大括號,return關鍵字以及語句分號。
示例:
1 public class LambdaTest06 { 2public static void main(String[] args) { 3invokeGame(()-> System.out.println("玩遊戲了")); 4} 5private static void invokeGame(Game game){ 6game.playGame(); 7} 8 }
Lambda使用前提
lambda使用需要注意的幾個問題:
-
必須有介面,且要求介面中只有且僅有一個抽象方法。
-
使用lambda必須有上下文推斷:方法的引數或者區域性變數必須為Lambda對應的介面型別,才能使用Lambda作為該介面的例項。