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