最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的函數(shù)式編程Lambda、方法引用詳解

 更新時間:2025年12月17日 11:27:30   作者:不懶的懶羊羊.  
函數(shù)式編程通過引入函數(shù)來解決問題,強調(diào)輸入一致輸出一致,Lambda表達式是Java 8引入的一種簡潔的語法,用于替代匿名內(nèi)部類,簡化代碼并提高可讀性,本文給大家介紹Java—函數(shù)式編程(Lambda、方法引用),感興趣的朋友跟隨小編一起看看吧

引入

函數(shù)式編程中“函數(shù)”類似于數(shù)學(xué)中的函數(shù)(強調(diào)做什么),只要輸入的數(shù)據(jù)一致返回的結(jié)果也是一致的

函數(shù)式編程解決了什么問題?什么是函數(shù)式編程?

使用Lambda函數(shù)替代嗎某些匿名內(nèi)部類對象,從而讓程序代碼更簡潔,可讀性更好。

一:Lambda

1、認識Lambda表達式

  • JDK8開始新增的一種語法形式,它表示函數(shù)。
  • 可以用于替代匿名內(nèi)部類對象,從而讓程序更簡潔,可讀性更好。
  • 注意:Lambda表達式只能替代函數(shù)式接口的匿名內(nèi)部類?。。?!。

什么是函數(shù)式接口

  • 且僅有一個抽象方法接口。

思考為什么只能替代函數(shù)式接口的匿名內(nèi)部類,分析:函數(shù)式接口只能有一個抽象方法,在簡化的時候,會找到這個抽象方法并為這個方法重寫。如果有多個抽象方法,簡化后:編譯器不知道要為那個抽象方法重寫。

Lambda表達式的書寫格式

(參數(shù)列表) -> { 表達式或語句塊 }
  • (參數(shù)列表):定義 Lambda 表達式接受的參數(shù)。參數(shù)的類型通??梢杂删幾g器推斷,因此可以省略。
  • ->:稱為 Lambda 操作符 或 箭頭操作符。它將參數(shù)列表與 Lambda 主體分隔開。
  • { 表達式或語句塊 }:Lambda 表達式的主體,包含要執(zhí)行的代碼。
  • 如果表達式或語句塊:只有一句{ }可以省略,否則不可省略。

Test類:代碼1演示了:注意:Lambda表達式只能替代函數(shù)式接口的匿名內(nèi)部類?。。?!。

public class Test {
    public static void main(String[] args) {
        System.out.println("______________抽象類的匿名內(nèi)部類_____________");
        Animal animal = new Animal() {
            @Override
            public void cry() {
                System.out.println("貓喵喵喵~~");
            }
        };
        animal.cry();
        System.out.println("______________簡化抽象類的匿名內(nèi)部類(報錯)_____________");
        //Lambda簡化匿名內(nèi)部類
        //下面代碼出錯,Lambda表達式只能替代函數(shù)式接口的匿名內(nèi)部類!?。?!。
//        Animal animal = ()->{
//            System.out.println("貓喵喵喵~~");
//        };
        System.out.println("______________接口的匿名內(nèi)部類_____________");
        Swim s = new Swim() {
            @Override
            public void swiming() {
                System.out.println("狗游游游~~");
            }
        };//分號不能忘
        s.swiming();
        System.out.println("______________簡化函數(shù)式接口的匿名內(nèi)部類_____________");
        Swim s1 = () -> {
            System.out.println("狗游游游~~");
        };
        s1.swiming();
    }
}
//動物類
abstract class Animal {
    abstract void cry();
}
//寫一個游泳接口
@FunctionalInterface //聲明函數(shù)式接口 ,函數(shù)式接口只能有一個抽象方法,
                     // 如果有多個抽象方法,使用注解聲明后會報錯
interface Swim {
    void swiming();
}
/*
輸出:
______________抽象類的匿名內(nèi)部類_____________
貓喵喵喵~~
______________簡化抽象類的匿名內(nèi)部類(報錯)_____________
______________接口的匿名內(nèi)部類_____________
狗游游游~~
______________簡化函數(shù)式接口的匿名內(nèi)部類_____________
狗游游游~~
 */

2、Lambda實戰(zhàn)實例、省略規(guī)則

1.使用Lambda簡化comparator接口的匿名內(nèi)部類

2.Lambda表達式的省略規(guī)則

作用:用于進一步簡化Lambda表達式寫法。

具體規(guī)則:

  • 參數(shù)類型全部可以省略不寫。
  • 如果只有一個參數(shù),參數(shù)類型省略的同時“()”也可以省略,但是對個參數(shù)不能省略“()”。
  • 如果Lambda表達式中只有一行代碼,大括號可以不寫,同時要省略分號“;” 如果這行代碼是return語句,也必須去掉return。

代碼2:下面是comparator接口sort對學(xué)生對象排序的代碼簡化過程。在上篇文章匿名內(nèi)部類中給過這個代碼的完整版本。

//        Arrays.sort( s, new Comparator<Student>() {
//            @Override
//            public  int compare(Student o1, Student o2) {
//                return o1.getAge() - o2.getAge();
//            }
//        });
//        Arrays.sort( s, (Student o1, Student o2) -> {
//            return o1.getAge() - o2.getAge();
//        });
//        Arrays.sort( s, ( o1,  o2) -> {
//            return o1.getAge() - o2.getAge();
//        });
        Arrays.sort( s, ( o1,  o2) -> o1.getAge() - o2.getAge());

二、方法引用

1、靜態(tài)方法引用

        靜態(tài)方法引用(Static Method Reference) 是一種特殊的語法,用于直接引用一個類的靜態(tài)方法,并將其作為函數(shù)式接口的實例。它是 Lambda 表達式的更簡潔替代形式。

語法:

類名::靜態(tài)方法名
  • 類名: 定義了靜態(tài)方法的類的名稱。
  • ::方法引用操作符。
  • 靜態(tài)方法名: 要引用的靜態(tài)方法的名稱,不帶括號 () 和參數(shù)。

使用場景

        如果某個Lambda表達式里只是調(diào)用一個靜態(tài)方法,并且“—>”前后參數(shù)的形式一致,(就像是下面的例子,->兩邊都是o1、o2)就可以使用靜態(tài)方法引用。

代碼3:下面代碼演示了靜態(tài)方法引用的使用場景

Student 類

public class Student {
    private String name;
    private int age;
    //構(gòu)造器
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //靜態(tài) 方法引用
    public static int compare(Student o1, Student o2){
        return o1.getAge() - o2.getAge();
    }
}

Test類

import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        Student []s = new Student[5];
        s[0] = new Student("張三", 18);
        s[1] = new Student("李四", 19);
        s[2] = new Student("張三", 50);
        s[3] = new Student("李白", 5);
        s[4] = new Student("王五", 10);
        print(s);
//        Arrays.sort(s,(o1, o2)-> o1.getAge() - o2.getAge());
//        Arrays.sort(s, (o1, o2)->Student.compare(o1, o2));
        //靜態(tài)方法引用
        Arrays.sort(s,Student::compare);
        System.out.println("-------排序后:-------");
        print(s);
    }
    //打印姓名和年齡
    public static void print(Student []s){
        for (int i = 0; i < s.length; i++){
            System.out.println(s[i]);
        }
    }
}

2、實例方法引用

語法

對象名::實例方法

使用場景

        如果某個Lambda表達式里只是通過對象名稱調(diào)用一個實例方法,并且“—>”前后參數(shù)的形式一致,就可以使用實例方法引用。

代碼4:演示了實例引用使用場景

Student類

public class Student {
    private String name;
    private int age;
    //構(gòu)造器
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student() {
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //實例方法方法引用
    public  int compare(Student o1, Student o2){
        return o1.getAge() - o2.getAge();
    }
}

Test類

import java.util.Arrays;
public class Testt  {
    public static void main(String[] args) {
        Student []s = new Student[5];
        s[0] = new Student("張三", 18);
        s[1] = new Student("李四", 19);
        s[2] = new Student("張三", 50);
        s[3] = new Student("李白", 5);
        s[4] = new Student("王五", 10);
        System.out.println("-------排序前:-------");
        print(s);
        Student t = new Student();
        //實例方法引用:對象名::實例方法名
        //前提:->前后參數(shù)形式一致,才能使用實例方法引用
        Arrays.sort(s, t::compare);
        System.out.println("-------排序后:-------");
        print(s);
    }
    //打印姓名和年齡
    public static void print(Student []s){
        for (int i = 0; i < s.length; i++){
            System.out.println(s[i]);
        }
    }
}
/*
輸出結(jié)果:
-------排序前:-------
Student{name='張三', age=18}
Student{name='李四', age=19}
Student{name='張三', age=50}
Student{name='李白', age=5}
Student{name='王五', age=10}
-------排序后:-------
Student{name='李白', age=5}
Student{name='王五', age=10}
Student{name='張三', age=18}
Student{name='李四', age=19}
Student{name='張三', age=50}
 */

3、特定類型方法的引用

語法

特定類型的名稱::方法

使用場景

        如果某個Lambda表達式里只是調(diào)用了一個特定類型的實例方法,并且前面參數(shù)列表中的第一個參數(shù)是作為方法主調(diào),后面的所有參數(shù)都是作為該實例方法的入?yún)⒌?/span>,則此時就可以使用特定類型的方法引用。

代碼5:演示特定方法引用的使用場景。

Test類

import java.util.Arrays;
import java.util.Comparator;
public class Test {
    public static void main(String[] args) {
        //給英語名稱排序
        String[] name = {"Tom", "Jerry", "Bobi", "曹操", "Mike","angela","Dlei","Jack","Andy","cao"};
        System.out.println("排序前:" + Arrays.toString(name));
        //把這個數(shù)組進行排序:
//        Arrays.sort(name);
//        System.out.println(Arrays.toString(name));
        //要求,忽略大小寫進行排序(Java官方默認是按照ASCII碼進行排序的)所以我們的要求官方默認搞不懂,
        // 需要我們自定義排序規(guī)則
//        Arrays.sort(name, new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                return o1.compareToIgnoreCase(o2); //java已經(jīng)為我們提供了字符串按照首字母忽略大小寫比較方法:compareToIgnoreCase
//            }
//        });
        //Lambda簡化
//        Arrays.sort(name, (o1, o2)->o1.compareToIgnoreCase(o2));
        //特定類型方法引用:類型名::方法名
        Arrays.sort(name, String::compareToIgnoreCase);
        System.out.println("排序后:" + Arrays.toString(name));
        Arrays.sort(name, String::compareToIgnoreCase);
    }
}
/*
輸出結(jié)果:
排序前:[Tom, Jerry, Bobi, 曹操, Mike, angela, Dlei, Jack, Andy, cao]
排序后:[Andy, angela, Bobi, cao, Dlei, Jack, Jerry, Mike, Tom, 曹操]
 */

4、構(gòu)造器引用

        構(gòu)造器引用(Constructor Reference) 是一種特殊的語法,用于引用一個類的構(gòu)造器,并將其作為函數(shù)式接口的實例。它允許你將“創(chuàng)建對象”這個行為當(dāng)作一個函數(shù)來傳遞,是 Lambda 表達式的簡潔替代。

語法:

類名::new

使用場景

        如果某個Lambda表達式里只是在創(chuàng)建對象,并且“—>”前后參數(shù)情況一致,就可以使用構(gòu)造器引用。

代碼6:理解構(gòu)造器引用

Test類:

public class Test {
    public static void main(String[] args) {
//        CarFactory cf = new CarFactory() {
//            @Override
//            public Car getCar(String name) {
//                return new Car(name);
//            }
//        };
        //創(chuàng)建對象
//        Car c = cf.getCar("法拉利");
        //簡化
//        CarFactory cf = name-> new Car(name);
        //用構(gòu)造器引用簡化
        CarFactory cf = Car::new;
        Car c = cf.getCar("法拉利");
        System.out.println(c);
    }
}
interface CarFactory{
    Car getCar(String name); //接口中的抽象方法,返回值類型為Car
}
class Car{
    private String name;
    public Car(String name) {
        this.name = name;
    }
    public Car(){}
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    //重新toString
    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                '}';
    }
}
/*
輸出結(jié)果:
Car{name='法拉利'}
 */

到此這篇關(guān)于Java中的函數(shù)式編程Lambda、方法引用詳解的文章就介紹到這了,更多相關(guān)java函數(shù)式編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java 中 request.getSession(true、false、null)的區(qū)別

    java 中 request.getSession(true、false、null)的區(qū)別

    這篇文章主要介紹了java 中 request.getSession(true/false/null)的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • SpringMVC中處理靜態(tài)資源的過程詳解

    SpringMVC中處理靜態(tài)資源的過程詳解

    本文給大家介紹SpringMVC中處理靜態(tài)資源的過程,結(jié)合示例代碼給大家講解的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • SpringBoot接口數(shù)據(jù)如何實現(xiàn)優(yōu)雅的脫敏問題

    SpringBoot接口數(shù)據(jù)如何實現(xiàn)優(yōu)雅的脫敏問題

    這篇文章主要介紹了SpringBoot接口數(shù)據(jù)如何實現(xiàn)優(yōu)雅的脫敏問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java C++題解leetcode816模糊坐標(biāo)示例

    Java C++題解leetcode816模糊坐標(biāo)示例

    這篇文章主要為大家介紹了Java C++題解leetcode816模糊坐標(biāo)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • java實現(xiàn)高效下載文件的方法

    java實現(xiàn)高效下載文件的方法

    這篇文章主要為大家詳細介紹了java實現(xiàn)高效下載文件的幾種方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JDBC連接MySQL并實現(xiàn)模糊查詢

    JDBC連接MySQL并實現(xiàn)模糊查詢

    本文詳細講解了JDBC連接MySQL并實現(xiàn)模糊查詢的方式,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Java輕量級權(quán)限認證框架Sa-Token的使用

    Java輕量級權(quán)限認證框架Sa-Token的使用

    Sa-Token是一個輕量級Java權(quán)限認證框架,本文就詳細的來介紹一下Java輕量級權(quán)限認證框架Sa-Token的使用,主要解決:登錄認證、權(quán)限認證、Session會話、單點登錄、OAuth2.0、微服務(wù)網(wǎng)關(guān)鑒權(quán)等,感興趣的可以了解一下
    2022-03-03
  • Spring實現(xiàn)擁有者權(quán)限驗證的方法示例

    Spring實現(xiàn)擁有者權(quán)限驗證的方法示例

    這篇文章主要介紹了Spring實現(xiàn)擁有者權(quán)限驗證的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java實現(xiàn)自定義ArrayList類的示例代碼

    Java實現(xiàn)自定義ArrayList類的示例代碼

    這篇文章主要為大家簡單的介紹ArrayList一下里面的add方法、size方法、isEmpty方法,以及如何實現(xiàn)自定義ArrayList類,感興趣的可以了解一下
    2022-08-08
  • Java內(nèi)部類的實現(xiàn)原理與可能的內(nèi)存泄漏說明

    Java內(nèi)部類的實現(xiàn)原理與可能的內(nèi)存泄漏說明

    這篇文章主要介紹了Java內(nèi)部類的實現(xiàn)原理與可能的內(nèi)存泄漏說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論

天全县| 延长县| 石林| 襄汾县| 永靖县| 交口县| 乌审旗| 高密市| 革吉县| 房产| 江陵县| 台湾省| 云浮市| 察隅县| 华阴市| 滨海县| 三江| 东台市| 房产| 会东县| 屯门区| 托克逊县| 汕头市| 宜良县| 富平县| 柳江县| 两当县| 牙克石市| 绥滨县| 瑞金市| 寿宁县| 东至县| 司法| 英吉沙县| 凉山| 尉犁县| 峨山| 海阳市| 乌恰县| 宜章县| 台江县|