首頁 > Java > java教程 > 怎麼理解Java中的lambda表達式

怎麼理解Java中的lambda表達式

WBOY
發布: 2022-06-02 21:10:24
轉載
2120 人瀏覽過

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

怎麼理解Java中的lambda表達式

推薦學習:《java影片教學

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影片教學

以上是怎麼理解Java中的lambda表達式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板