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

Java中Lambda表達(dá)式使用場景實(shí)例詳解

 更新時(shí)間:2025年08月14日 14:25:16   作者:Mercury_春秋  
本文給大家介紹Java中Lambda表達(dá)式使用及詳解,講解Lambda表達(dá)式的概念、語法及其應(yīng)用場景,并探討如何利用函數(shù)引用進(jìn)一步提高代碼效率,感興趣的朋友一起看看吧

Java中Lambda表達(dá)式使用及詳解

前言

一、Lambda表達(dá)式的簡介

Lambda表達(dá)式(閉包):java8的新特性,lambda運(yùn)行將函數(shù)作為一個(gè)方法的參數(shù),也就是函數(shù)作為參數(shù)傳遞到方法中。使用lambda表達(dá)式可以讓代碼更加簡潔。

Lambda表達(dá)式的使用場景:用以簡化接口實(shí)現(xiàn)。

關(guān)于接口實(shí)現(xiàn),可以有很多種方式來實(shí)現(xiàn)。例如:設(shè)計(jì)接口的實(shí)現(xiàn)類、使用匿名內(nèi)部類。 但是lambda表達(dá)式,比這兩種方式都簡單。

package test;
/**
 * @author: Mercury
 * Date: 2022/3/20
 * Time: 17:48
 * Description:Lambda表達(dá)式
 * Version:1.0
 */
public class Test04 {
    public static void main(String[] args) {
        //使用lambda表達(dá)式實(shí)現(xiàn)接口
        Test test = () -> {
            System.out.println("test");
        };
        test.test();
    }
}
interface Test{
    public void test();
}

二、Lambda表達(dá)式對接口的要求

雖然說,lambda表達(dá)式可以在?定程度上簡化接口的實(shí)現(xiàn)。但是,并不是所有的接口都可以使用lambda表達(dá)式來簡潔實(shí)現(xiàn)的。

lambda表達(dá)式畢竟只是?個(gè)匿名方法。當(dāng)實(shí)現(xiàn)的接口中的方法過多或者多少的時(shí)候,lambda表達(dá)式都是不適用的。

lambda表達(dá)式,只能實(shí)現(xiàn)函數(shù)式接口。

1.函數(shù)式接口

如果說,?個(gè)接口中,要求實(shí)現(xiàn)類必須實(shí)現(xiàn)的抽象方法,有且只有?個(gè)!這樣的接口,就是函數(shù)式接口。

代碼如下(示例):

//有且只有一個(gè)實(shí)現(xiàn)類必須要實(shí)現(xiàn)的抽象方法,所以是函數(shù)式接口
interface Test{
    public void test();
}

2.@FunctionalInterface

是?個(gè)注解,用在接口之前,判斷這個(gè)接口是否是?個(gè)函數(shù)式接口。 如果是函數(shù)式接口,沒有任何問題。如果不是函數(shù)式接口,則會報(bào)錯(cuò)。功能類似于 @Override。
代碼如下(示例):

@FunctionalInterface
interface Test{
    public void test();
}

3.Lambda表達(dá)式的語法

1.Lambda表達(dá)式的基礎(chǔ)語法

lambda表達(dá)式,其實(shí)本質(zhì)來講,就是?個(gè)匿名函數(shù)。因此在寫lambda表達(dá)式的時(shí)候,不需要關(guān)心方法名是什么。

實(shí)際上,我們在寫lambda表達(dá)式的時(shí)候,也不需要關(guān)心返回值類型。

我們在寫lambda表達(dá)式的時(shí)候,只需要關(guān)注兩部分內(nèi)容即可:參數(shù)列表和方法體

lambda表達(dá)式的基礎(chǔ)語法:
(參數(shù)1,參數(shù)2,…) -> {
方法體
};

參數(shù)部分:方法的參數(shù)列表,要求和實(shí)現(xiàn)的接口中的方法參數(shù)部分?致,包括參數(shù)的數(shù)量和類型。

方法體部分 : 方法的實(shí)現(xiàn)部分,如果接口中定義的方法有返回值,則在實(shí)現(xiàn)的時(shí)候,注意返回值的返回。

-> : 分隔參數(shù)部分和方法體部分。

代碼示例:

package test;
/**
 * @author: Mercury
 * Date: 2022/3/20
 * Time: 17:48
 * Description:Lambda表達(dá)式
 * Version:1.0
 */
public class Test04 {
    public static void main(String[] args) {
        //使用lambda表達(dá)式實(shí)現(xiàn)接口
        //無參
//        Test test = () -> {
//            System.out.println("test");
//        };
        //有參
//        Test test = (name,age) -> {
//            System.out.println(name+age+"歲了!");
//        };
//        test.test("小新",18);
        //有參+返回值
        Test test = (name,age)  -> {
            System.out.println(name+age+"歲了!");
            return age + 1;
        };
        int age = test.test("小新",18);
        System.out.println(age);
    }
}
//無參
//interface Test{
//    public void test();
//}
//有參 無返回值
//interface Test{
//    public void test(String name,int age);
//}
//有參 有返回值
interface Test{
    public int test(String name,int age);
}

4.Lambda表達(dá)式的語法進(jìn)階

參數(shù)部分的精簡

參數(shù)的類型

由于在接口的方法中,已經(jīng)定義了每?個(gè)參數(shù)的類型是什么。而且在使用lambda表達(dá)式實(shí)現(xiàn)接口的時(shí)候,必須要保證參數(shù)的數(shù)量和類 型需要和接口中的方法保持?致。因此,此時(shí)lambda表達(dá)式中的參數(shù)的類型可以省略不寫。

注意點(diǎn):

如果需要省略參數(shù)的類型,要保證:要省略, 每?個(gè)參數(shù)的類型都必須省略不寫。絕對不能出現(xiàn),有的參數(shù)類型省略了,有的參數(shù)類型沒有省略。

        //有參+返回值
        Test test = (name,age)  -> {
            System.out.println(name+age+"歲了!");
            return age + 1;
        };
        int age = test.test("小新",18);
        System.out.println(age);

參數(shù)的小括號

如果方法的參數(shù)列表中的參數(shù)數(shù)量 有且只有?個(gè),此時(shí),參數(shù)列表的小括號是可以省略不寫的。

注意事項(xiàng):

  • 只有當(dāng)參數(shù)的數(shù)量是?個(gè)的時(shí)候, 多了、少了都不能省略。
  • 省略掉小括號的同時(shí), 必須要省略參數(shù)的類型
        //一個(gè)參數(shù)
        Test test = name -> {
            System.out.println(name+"test");
        };
        test.test("小新");

方法體部分的精簡

方法體?括號的精簡

當(dāng)?個(gè)方法體中的邏輯,有且只有?句的情況下,?括號可以省略

Test test = name -> System.out.println(name+"test");
        test.test("小新");

return的精簡

如果?個(gè)方法中唯?的?條語句是?個(gè)返回語句, 此時(shí)在省略掉大括號的同時(shí), 也必須省略掉return。

Test test = (a,b) -> a+b;

三、函數(shù)引用

lambda表達(dá)式是為了簡化接口的實(shí)現(xiàn)的。在lambda表達(dá)式中,不應(yīng)該出現(xiàn)比較復(fù)雜的邏輯。如果在lambda表達(dá)式中出現(xiàn)了過于復(fù)雜的邏輯,會對程序的可讀性造成非常大的影響。如果在lambda表達(dá)式中需要處理的邏輯比較復(fù)雜,?般情況會單獨(dú)的寫?個(gè)方法。在lambda表達(dá)式中直接引用這個(gè)方法即可。

函數(shù)引用:引用?個(gè)已經(jīng)存在的方法,使其替代lambda表達(dá)式完成接口的實(shí)現(xiàn)

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

語法:類::靜態(tài)方法

注意事項(xiàng):

  • 在引用的方法后面,不要添加小括號。
  • 引用的這個(gè)方法,參數(shù)(數(shù)量、類型)和返回值,必須要跟接口中定義的?致
package test;
/**
 * @author: Mercury
 * Date: 2022/3/20
 * Time: 18:17
 * Description:lambda表達(dá)式靜態(tài)方法引用
 * Version:1.0
 */
public class Test05 {
    public static void main(String[] args) {
        //實(shí)現(xiàn)多個(gè)參數(shù),一個(gè)返回值的接口
        //對一個(gè)靜態(tài)方法的引用,語法:類::靜態(tài)方法
        Test1 test1 = Calculator::calculate;
        System.out.println(test1.test(4,5));
    }
}
class Calculator{
    public static int calculate(int a,int b ){
        // 稍微復(fù)雜的邏輯:計(jì)算a和b的差值的絕對值
        if (a > b) {
            return a - b;
        }
        return b - a;
    }
}
interface Test1{
    int test(int a,int b);
}

2.非靜態(tài)方法的引用

語法:對象::非靜態(tài)方法

注意事項(xiàng):

  • 在引用的方法后?,不要添加小括號。
  • 引用的這個(gè)方法, 參數(shù)(數(shù)量、類型) 和 返回值, 必須要跟接口中定義的?致。
package test;
/**
 * @author: Mercury
 * Date: 2022/3/21
 * Time: 8:14
 * Description:lambda表達(dá)式對非靜態(tài)方法的引用
 * Version:1.0
 */
public class Test06 {
    public static void main(String[] args) {
        //對非靜態(tài)方法的引用,需要使用對象來完成
        Test2 test2 = new Calculator()::calculate;
        System.out.println(test2.calculate(2, 3));
    }
    private static class Calculator{
        public int calculate(int a, int b) {
            return a > b ? a - b : b - a;
         }
    }
}
interface Test2{
    int calculate(int a,int b);
}

3.構(gòu)造方法的引用

使用場景

如果某?個(gè)函數(shù)式接口中定義的方法,僅僅是為了得到?個(gè)類的對象。此時(shí)我們就可以使用構(gòu)造方法的引用,簡化這個(gè)方法的實(shí)現(xiàn)。

語法:類名::new

注意事項(xiàng):可以通過接口中的方法的參數(shù), 區(qū)分引用不同的構(gòu)造方法。

package com.cq.test;
/**
 * @author: Mercury
 * Date: 2022/4/27
 * Time: 10:31
 * Description:lambda構(gòu)造方法的引用
 * Version:1.0
 */
public class Test {
    private static class Dog{
        String name;
        int age;
        //無參構(gòu)造
        public Dog(){
            System.out.println("一個(gè)Dog對象通過無參構(gòu)造被實(shí)例化了");
        }
        //有參構(gòu)造
        public Dog(String name,int age){
            System.out.println("一個(gè)Dog對象通過有參構(gòu)造被實(shí)例化了");
            this.name = name;
            this.age = age;
        }
    }
    //定義一個(gè)函數(shù)式接口,用以獲取無參的對象
    @FunctionalInterface
    private interface GetDog{
        //若此方法僅僅是為了獲得一個(gè)Dog對象,而且通過無參構(gòu)造去獲取一個(gè)Dog對象作為返回值
        Dog test();
    }
    //定義一個(gè)函數(shù)式接口,用以獲取有參的對象
    @FunctionalInterface
    private interface GetDogWithParameter{
        //若此方法僅僅是為了獲得一個(gè)Dog對象,而且通過有參構(gòu)造去獲取一個(gè)Dog對象作為返回值
        Dog test(String name,int age);
    }
    // 測試
    public static void main(String[] args) {
        //lambda表達(dá)式實(shí)現(xiàn)接口
        GetDog lm = Dog::new; //引用到Dog類中的無參構(gòu)造方法,獲取到一個(gè)Dog對象
        Dog dog = lm.test();
        System.out.println("修狗的名字:"+dog.name+" 修狗的年齡:"+dog.age); //修狗的名字:null 修狗的年齡:0
        GetDogWithParameter lm2 = Dog::new;//引用到Dog類中的有參構(gòu)造,來獲取一個(gè)Dog對象
        Dog dog1 = lm2.test("薩摩耶",2);
        System.out.println("修狗的名字:"+dog1.name+" 修狗的年齡:"+dog1.age);//修狗的名字:薩摩耶 修狗的年齡:2
    }
}

四、Lambda表達(dá)式需要注意的問題

這?類似于局部內(nèi)部類、匿名內(nèi)部類,依然存在閉包的問題。

如果在lambda表達(dá)式中,使用到了局部變量,那么這個(gè)局部變量會被隱式的聲明為 final。是?個(gè)常量,不能修改值。

總結(jié)

以上就是Lambda表達(dá)式相關(guān)內(nèi)容,本文僅簡單介紹了Lambda表達(dá)式的使用,祝各位小伙伴們學(xué)習(xí)愉快,歡迎交流!

到此這篇關(guān)于Java中Lambda表達(dá)式使用場景舉例的文章就介紹到這了,更多相關(guān)java lambda表達(dá)式使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Idea?編譯并運(yùn)行?Spark?3.1.1?源碼的方法

    Idea?編譯并運(yùn)行?Spark?3.1.1?源碼的方法

    這篇文章主要介紹了Idea?編譯并運(yùn)行?Spark?3.1.1源碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • JavaWeb基礎(chǔ)教程之Java基礎(chǔ)加強(qiáng)版

    JavaWeb基礎(chǔ)教程之Java基礎(chǔ)加強(qiáng)版

    這篇文章主要介紹了JavaWeb基礎(chǔ)教程之Java基礎(chǔ)加強(qiáng)版的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • springboot如何獲取application.yml里值的方法

    springboot如何獲取application.yml里值的方法

    這篇文章主要介紹了springboot如何獲取application.yml里的值,文章圍繞主題相關(guān)自資料展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • PowerJob分布式任務(wù)調(diào)度源碼流程解讀

    PowerJob分布式任務(wù)調(diào)度源碼流程解讀

    這篇文章主要為大家介紹了PowerJob分布式任務(wù)調(diào)度源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • 淺談Spring中Bean的作用域、生命周期

    淺談Spring中Bean的作用域、生命周期

    這篇文章主要介紹了淺談Spring中Bean的作用域、生命周期,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 關(guān)于通用xml報(bào)文創(chuàng)建和解析方式

    關(guān)于通用xml報(bào)文創(chuàng)建和解析方式

    文章介紹簡單XML報(bào)文的結(jié)構(gòu)特點(diǎn)(3-4層節(jié)點(diǎn))及使用Freemarker生成的方法,包括創(chuàng)建Maven項(xiàng)目、配置依賴、模板文件位置(resource目錄)和測試代碼示例,并預(yù)告后續(xù)將講解Freemarker模板語法
    2025-08-08
  • maven項(xiàng)目切換JDK踩坑指南分享

    maven項(xiàng)目切換JDK踩坑指南分享

    文章介紹了如何在Windows系統(tǒng)中配置多版本JDK環(huán)境,并解決環(huán)境變量配置失效的問題,同時(shí),還提供了在IntelliJ?IDEA中配置不同項(xiàng)目JDK版本的方法
    2024-11-11
  • SpringBoot整合Mybatis Generator自動(dòng)生成代碼

    SpringBoot整合Mybatis Generator自動(dòng)生成代碼

    SpringBoot 整合 Mybatis Generator自動(dòng)生成dao、entity、mapper.xml實(shí)現(xiàn)單表增刪改查。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • java解析xml匯總_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    java解析xml匯總_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了java解析xml匯總_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Netty解決半包和粘包問題的方案

    Netty解決半包和粘包問題的方案

    Netty 是一個(gè)高性能、異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,廣泛應(yīng)用于各種網(wǎng)絡(luò)通信場景,這篇文章,我們將詳細(xì)分析 Netty 是如何解決半包和粘包問題,文中通過代碼示介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08

最新評論

新蔡县| 明星| 怀宁县| 新郑市| 遂川县| 龙州县| 吐鲁番市| 佛冈县| 海淀区| 汝州市| 酉阳| 铅山县| 凯里市| 玉门市| 方山县| 壶关县| 郯城县| 西华县| 竹溪县| 郴州市| 泰兴市| 朝阳市| 法库县| 巫山县| 芜湖市| 佛坪县| 临海市| 灯塔市| 咸宁市| 高碑店市| SHOW| 枣阳市| 瑞丽市| 沁水县| 龙岩市| 兴化市| 政和县| 淄博市| 广宗县| 横峰县| 丰城市|