推薦學習:《》
Lambda表示式是JDK8開始後的一種新語法形式
作用:簡化匿名內部類的程式碼寫法
格式:
(匿名內部類被重寫方法的形參列表)->{ 被重寫方法的方法體程式碼 } 注:->是語法形式,無實際意義
首先我們先定義一個抽象類,通過匿名內部類重寫其方法,再對其進行簡化,比較二者之間有何變化:
使用Lambda表示式之前:
public static void main (String[] args){ People p = new People(){ @Override public void run(){ System.out.println("小學生跑的很慢"); } }; p.run(); } abstract class People{ public abstract void run(); }使用Lambda表示式之後:
People p = ()->{ System.out.println("小學生跑的很慢"); }; //會出現報錯會出現報錯,這是為什麼呢?原因在於前面對於Lambda表示式的定義並不清晰,Lambda表示式並不能簡化所有匿名內部類,其只能簡化函數式介面匿名內部類的寫法形式,且介面中有且僅有一個抽象方法,通常,我們會再介面上加上一個@Functionalinterface註解,標記該介面必須是滿足函數式介面。
真正意義上通過Lambda表示式簡化:
@FunctionalInterface//加上這個註解必須是函數式介面,且只有一個抽象方法 interface People{ void run(); } //簡化之前的匿名內部類 People p = new People(){ @Override public void run(){ System.out.println("小學生跑的很慢!"); } }; //簡化之後 People p = () -> { System.out.println("小學生跑的很慢!"); };另外,也可以將其作為引數代入方法中去使用:
//在原來的基礎上定義一個pk方法 public static void pk(People p){ System.out.println("跑步情況如何:") p.run(); } //不使用Lambda的情況下: pk(p);//需要在定義匿名內部類之後,將p代入; //使用Lambda的情況: People p = () -> { System.out.println("小學生跑的很慢!"); }; pk(() -> { System.out.println("小學生跑的很慢!"); }); //由於等號右邊即是People建立的物件p,因此可以可以直接將其代入
Lambda的好處:
Lambda是一個匿名函數,我們可以把Lambda表示式理解為是一段可以傳遞的程式碼,它可以寫出更簡潔、更靈活的程式碼,作為一種更緊湊的程式碼風格,使Java語言表達能力得到了提升。
在之前的學習過程中,我們學習過了Arrays的相關知識,其中有一個sort方法(可以將陣列升序或降序排列),它其實也是介面類,並且只有一個抽象方法:
//精簡之前: Arrays.sort(grade,new Comparator<Integer>(){ @Override public int compare(Integer o1,Integer o2){ return o2 -o1; } }); //精簡之後: Arrays.sort(grade,(Integer o1,Integer o2) -> { return o2 -o1; });
- 引數型別可以省略不寫
//參考前面的實戰例子 Arrays.sort(grade,(Integer o1,Integer o2) -> { return o2 -o1; }); //省略引數型別之後 Arrays.sort(grade,( o1, o2){ return o2 -o1; });
- 如果只有一個引數,引數型別可以省略,同時()也可以省略
//簡單參照一個單個引數的例子,不需要了解其具體含義 btn.addActionListener((ActionEvent e) -> { System.out.println("我是簡單的例子。"); }); //簡化之後: btn.addActionListener( e -> { System.out.println("我是簡單的例子。"); });
- 如果Lambda表示式的方法體程式碼只有一行程式碼。可以省略大括號不寫,同時要省略分號
//參照上一條規則的例子 btn.addActionListener( e -> { System.out.println("我是簡單的例子。"); }); //簡化之後: btn.addActionListener( e -> System.out.println("我是簡單的例子。") );
- 如果Lambda表示式的方法體程式碼只有一行程式碼。可以省略大括號不寫。此時,如果這行程式碼是return語句,必須省略return不寫,同時也必須省略";"不寫
//參照第一條規則的程式碼 Arrays.sort(grade,(Integer o1,Integer o2) -> { return o2 -o1; }); //簡化之後: Arrays.sort(grade,( o1, o2)-> o2 -o1);
推薦學習:《》
以上就是怎麼理解Java中的lambda表示式的詳細內容,更多請關注TW511.COM其它相關文章!