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

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

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

引入

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

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

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

一:Lambda

1、認(rèn)識(shí)Lambda表達(dá)式

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

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

  • 且僅有一個(gè)抽象方法接口。

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

Lambda表達(dá)式的書(shū)寫(xiě)格式

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

Test類:代碼1演示了:注意:Lambda表達(dá)式只能替代函數(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("______________簡(jiǎn)化抽象類的匿名內(nèi)部類(報(bào)錯(cuò))_____________");
        //Lambda簡(jiǎn)化匿名內(nèi)部類
        //下面代碼出錯(cuò),Lambda表達(dá)式只能替代函數(shù)式接口的匿名內(nèi)部類?。。。?。
//        Animal animal = ()->{
//            System.out.println("貓喵喵喵~~");
//        };
        System.out.println("______________接口的匿名內(nèi)部類_____________");
        Swim s = new Swim() {
            @Override
            public void swiming() {
                System.out.println("狗游游游~~");
            }
        };//分號(hào)不能忘
        s.swiming();
        System.out.println("______________簡(jiǎn)化函數(shù)式接口的匿名內(nèi)部類_____________");
        Swim s1 = () -> {
            System.out.println("狗游游游~~");
        };
        s1.swiming();
    }
}
//動(dòng)物類
abstract class Animal {
    abstract void cry();
}
//寫(xiě)一個(gè)游泳接口
@FunctionalInterface //聲明函數(shù)式接口 ,函數(shù)式接口只能有一個(gè)抽象方法,
                     // 如果有多個(gè)抽象方法,使用注解聲明后會(huì)報(bào)錯(cuò)
interface Swim {
    void swiming();
}
/*
輸出:
______________抽象類的匿名內(nèi)部類_____________
貓喵喵喵~~
______________簡(jiǎn)化抽象類的匿名內(nèi)部類(報(bào)錯(cuò))_____________
______________接口的匿名內(nèi)部類_____________
狗游游游~~
______________簡(jiǎn)化函數(shù)式接口的匿名內(nèi)部類_____________
狗游游游~~
 */

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

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

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

作用:用于進(jìn)一步簡(jiǎn)化Lambda表達(dá)式寫(xiě)法。

具體規(guī)則:

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

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

//        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) 是一種特殊的語(yǔ)法,用于直接引用一個(gè)類的靜態(tài)方法,并將其作為函數(shù)式接口的實(shí)例。它是 Lambda 表達(dá)式的更簡(jiǎn)潔替代形式。

語(yǔ)法:

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

使用場(chǎng)景

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

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

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、實(shí)例方法引用

語(yǔ)法

對(duì)象名::實(shí)例方法

使用場(chǎng)景

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

代碼4:演示了實(shí)例引用使用場(chǎng)景

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 +
                '}';
    }
    //實(shí)例方法方法引用
    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í)例方法引用:對(duì)象名::實(shí)例方法名
        //前提:->前后參數(shù)形式一致,才能使用實(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、特定類型方法的引用

語(yǔ)法

特定類型的名稱::方法

使用場(chǎng)景

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

代碼5:演示特定方法引用的使用場(chǎng)景。

Test類

import java.util.Arrays;
import java.util.Comparator;
public class Test {
    public static void main(String[] args) {
        //給英語(yǔ)名稱排序
        String[] name = {"Tom", "Jerry", "Bobi", "曹操", "Mike","angela","Dlei","Jack","Andy","cao"};
        System.out.println("排序前:" + Arrays.toString(name));
        //把這個(gè)數(shù)組進(jìn)行排序:
//        Arrays.sort(name);
//        System.out.println(Arrays.toString(name));
        //要求,忽略大小寫(xiě)進(jìn)行排序(Java官方默認(rèn)是按照ASCII碼進(jìn)行排序的)所以我們的要求官方默認(rèn)搞不懂,
        // 需要我們自定義排序規(guī)則
//        Arrays.sort(name, new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                return o1.compareToIgnoreCase(o2); //java已經(jīng)為我們提供了字符串按照首字母忽略大小寫(xiě)比較方法:compareToIgnoreCase
//            }
//        });
        //Lambda簡(jiǎn)化
//        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) 是一種特殊的語(yǔ)法,用于引用一個(gè)類的構(gòu)造器,并將其作為函數(shù)式接口的實(shí)例。它允許你將“創(chuàng)建對(duì)象”這個(gè)行為當(dāng)作一個(gè)函數(shù)來(lái)傳遞,是 Lambda 表達(dá)式的簡(jiǎn)潔替代。

語(yǔ)法:

類名::new

使用場(chǎng)景

        如果某個(gè)Lambda表達(dá)式里只是在創(chuàng)建對(duì)象,并且“—>”前后參數(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)建對(duì)象
//        Car c = cf.getCar("法拉利");
        //簡(jiǎn)化
//        CarFactory cf = name-> new Car(name);
        //用構(gòu)造器引用簡(jiǎn)化
        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)容請(qǐng)搜索腳本之家以前的文章或繼續(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)資源的過(guò)程詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

云安县| 平利县| 红桥区| 洱源县| 永兴县| 渭南市| 冕宁县| 惠安县| 宜丰县| 龙州县| 宜城市| 太和县| 句容市| 邯郸市| 会泽县| 武夷山市| 赞皇县| 城固县| 黄浦区| 华坪县| 汉寿县| 石嘴山市| 孝昌县| 乌鲁木齐县| 永年县| 新河县| 台州市| 京山县| 南岸区| 习水县| 阿克陶县| 新余市| 合肥市| 枣阳市| 通州区| 墨江| 灯塔市| 大名县| 禄劝| 柳州市| 德兴市|