Lambda表達式

Lambda表達式

初識lambda

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表達式標準格式

Lambda由三個部分組成線程

1.參數 2.一個箭頭 3.一段代碼code

Lambda表達式的標準格式爲:對象

(參數類型  參數名稱) ->{ 代碼語句 }

 

格式說明:

  • 小括號內是參數類型和參數名稱,若是沒有參數,能夠什麼都不寫,多個參數則用逗號分隔

  • ->是lambda表達式新引進d的語法格式,表明指向操做

  • 大括號與傳統的代碼 同樣,寫具體實現。

Lambda表達式無參無返回值

給定一個接口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 }

 

Lambda的參數和返回值

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 }

 

Lambda表達式有參有返回值

計算器接口

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 }

 

Lambda的省略格式

省略規則

  1. 小括號內參數類型能夠省略;

  2. 若是小括號內有且只有一個參數,則小括號能夠省略

  3. 若是大括號只有且僅有一個語句,則不管有無返回值,均可以省略大括號,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使用須要注意的幾個問題:

  1. 必須有接口,且要求接口中只有且僅有一個抽象方法。

  2. 使用lambda必須有上下文推斷:方法的參數或者局部變量必須爲Lambda對應的接口類型,才能使用Lambda做爲該接口的實例。

相關文章
相關標籤/搜索