怎麼理解Java中的lambda表示式

2022-06-02 14:00:39
本篇文章給大家帶來了關於的相關知識,其中主要介紹了關於lambda表示式的相關問題,Lambda表示式是JDK8開始後的一種新語法形式,能夠簡化匿名內部類的程式碼寫法,下面一起來看一下,希望對大家有幫助。


推薦學習:《》

Lambda概述

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語言表達能力得到了提升。

Lambda實戰的作用

在之前的學習過程中,我們學習過了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;
});

Lambda表示式省略規則

  • 引數型別可以省略不寫
//參考前面的實戰例子
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其它相關文章!