溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中Lambda表達(dá)式使用的方法是什么

發(fā)布時(shí)間:2023-04-28 11:01:16 來(lái)源:億速云 閱讀:115 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“Java中Lambda表達(dá)式使用的方法是什么”,在日常操作中,相信很多人在Java中Lambda表達(dá)式使用的方法是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java中Lambda表達(dá)式使用的方法是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

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

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

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

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

    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á)式對(duì)接口的要求

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

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

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

    1.函數(shù)式接口

    如果說(shuō),?個(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ù)式接口,沒(méi)有任何問(wèn)題。如果不是函數(shù)式接口,則會(huì)報(bào)錯(cuò)。功能類似于 @Override。
    代碼如下(示例):

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

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

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

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

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

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

    lambda表達(dá)式的基礎(chǔ)語(yǔ)法:
    (參數(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)接口
            //無(wú)參
    //        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);
        }
    }
    //無(wú)參
    //interface Test{
    //    public void test();
    //}
    //有參 無(wú)返回值
    //interface Test{
    //    public void test(String name,int age);
    //}
    //有參 有返回值
    interface Test{
        public int test(String name,int age);
    }

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

    參數(shù)部分的精簡(jiǎn)

    參數(shù)的類型

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

    注意點(diǎn):

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

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

    參數(shù)的小括號(hào)

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

    注意事項(xiàng):

    • 只有當(dāng)參數(shù)的數(shù)量是?個(gè)的時(shí)候, 多了、少了都不能省略。

    • 省略掉小括號(hào)的同時(shí), 必須要省略參數(shù)的類型

            //一個(gè)參數(shù)
            Test test = name -> {
                System.out.println(name+"test");
            };
            test.test("小新");

    方法體部分的精簡(jiǎn)

    方法體?括號(hào)的精簡(jiǎn)

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

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

    return的精簡(jiǎn)

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

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

    三、函數(shù)引用

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

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

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

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

    注意事項(xiàng):

    • 在引用的方法后面,不要添加小括號(hào)。

    • 引用的這個(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è)返回值的接口
            //對(duì)一個(gè)靜態(tài)方法的引用,語(yǔ)法:類::靜態(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的差值的絕對(duì)值
            if (a > b) {
                return a - b;
            }
            return b - a;
        }
    }
    interface Test1{
        int test(int a,int b);
    }
    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è)返回值的接口
            //對(duì)一個(gè)靜態(tài)方法的引用,語(yǔ)法:類::靜態(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的差值的絕對(duì)值
            if (a > b) {
                return a - b;
            }
            return b - a;
        }
    }
    interface Test1{
        int test(int a,int b);
    }

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

    語(yǔ)法:對(duì)象::非靜態(tài)方法

    注意事項(xiàng):

    • 在引用的方法后?,不要添加小括號(hào)。

    • 引用的這個(gè)方法, 參數(shù)(數(shù)量、類型) 和 返回值, 必須要跟接口中定義的?致。

    package test;
    /**
     * @author: Mercury
     * Date: 2022/3/21
     * Time: 8:14
     * Description:lambda表達(dá)式對(duì)非靜態(tài)方法的引用
     * Version:1.0
     */
    public class Test06 {
        public static void main(String[] args) {
            //對(duì)非靜態(tài)方法的引用,需要使用對(duì)象來(lá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)造方法的引用

    使用場(chǎng)景

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

    語(yǔ)法:類名::new

    注意事項(xiàng):可以通過(guò)接口中的方法的參數(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;
            //無(wú)參構(gòu)造
            public Dog(){
                System.out.println("一個(gè)Dog對(duì)象通過(guò)無(wú)參構(gòu)造被實(shí)例化了");
            }
            //有參構(gòu)造
            public Dog(String name,int age){
                System.out.println("一個(gè)Dog對(duì)象通過(guò)有參構(gòu)造被實(shí)例化了");
                this.name = name;
                this.age = age;
            }
        }
        //定義一個(gè)函數(shù)式接口,用以獲取無(wú)參的對(duì)象
        @FunctionalInterface
        private interface GetDog{
            //若此方法僅僅是為了獲得一個(gè)Dog對(duì)象,而且通過(guò)無(wú)參構(gòu)造去獲取一個(gè)Dog對(duì)象作為返回值
            Dog test();
        }
        //定義一個(gè)函數(shù)式接口,用以獲取有參的對(duì)象
        @FunctionalInterface
        private interface GetDogWithParameter{
            //若此方法僅僅是為了獲得一個(gè)Dog對(duì)象,而且通過(guò)有參構(gòu)造去獲取一個(gè)Dog對(duì)象作為返回值
            Dog test(String name,int age);
        }
        // 測(cè)試
        public static void main(String[] args) {
            //lambda表達(dá)式實(shí)現(xiàn)接口
            GetDog lm = Dog::new; //引用到Dog類中的無(wú)參構(gòu)造方法,獲取到一個(gè)Dog對(duì)象
            Dog dog = lm.test();
            System.out.println("修狗的名字:"+dog.name+" 修狗的年齡:"+dog.age); //修狗的名字:null 修狗的年齡:0
            GetDogWithParameter lm2 = Dog::new;//引用到Dog類中的有參構(gòu)造,來(lái)獲取一個(gè)Dog對(duì)象
            Dog dog1 = lm2.test("薩摩耶",2);
            System.out.println("修狗的名字:"+dog1.name+" 修狗的年齡:"+dog1.age);//修狗的名字:薩摩耶 修狗的年齡:2
        }
    }

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

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

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

    到此,關(guān)于“Java中Lambda表達(dá)式使用的方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI