中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Lambda表達式使用的方法是什么

發布時間:2023-04-28 11:01:16 來源:億速云 閱讀:115 作者:iii 欄目:開發技術

這篇文章主要介紹“Java中Lambda表達式使用的方法是什么”,在日常操作中,相信很多人在Java中Lambda表達式使用的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中Lambda表達式使用的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    一、Lambda表達式的簡介

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

    Lambda表達式的使用場景:用以簡化接口實現。

    關于接口實現,可以有很多種方式來實現。例如:設計接口的實現類、使用匿名內部類。 但是lambda表達式,比這兩種方式都簡單。

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

    二、Lambda表達式對接口的要求

    雖然說,lambda表達式可以在?定程度上簡化接口的實現。但是,并不是所有的接口都可以使用lambda表達式來簡潔實現的。

    lambda表達式畢竟只是?個匿名方法。當實現的接口中的方法過多或者多少的時候,lambda表達式都是不適用的。

    lambda表達式,只能實現函數式接口。

    1.函數式接口

    如果說,?個接口中,要求實現類必須實現的抽象方法,有且只有?個!這樣的接口,就是函數式接口。

    代碼如下(示例):

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

    2.@FunctionalInterface

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

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

    3.Lambda表達式的語法

    1.Lambda表達式的基礎語法

    lambda表達式,其實本質來講,就是?個匿名函數。因此在寫lambda表達式的時候,不需要關心方法名是什么。

    實際上,我們在寫lambda表達式的時候,也不需要關心返回值類型。

    我們在寫lambda表達式的時候,只需要關注兩部分內容即可:參數列表和方法體

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

    參數部分:方法的參數列表,要求和實現的接口中的方法參數部分?致,包括參數的數量和類型。

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

    -> : 分隔參數部分和方法體部分。

    代碼示例:

    package test;
    /**
     * @author: Mercury
     * Date: 2022/3/20
     * Time: 17:48
     * Description:Lambda表達式
     * Version:1.0
     */
    public class Test04 {
        public static void main(String[] args) {
            //使用lambda表達式實現接口
            //無參
    //        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表達式的語法進階

    參數部分的精簡

    參數的類型

    由于在接口的方法中,已經定義了每?個參數的類型是什么。而且在使用lambda表達式實現接口的時候,必須要保證參數的數量和類 型需要和接口中的方法保持?致。因此,此時lambda表達式中的參數的類型可以省略不寫。

    注意點:

    如果需要省略參數的類型,要保證:要省略, 每?個參數的類型都必須省略不寫。絕對不能出現,有的參數類型省略了,有的參數類型沒有省略。

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

    參數的小括號

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

    注意事項:

    • 只有當參數的數量是?個的時候, 多了、少了都不能省略。

    • 省略掉小括號的同時, 必須要省略參數的類型

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

    方法體部分的精簡

    方法體?括號的精簡

    當?個方法體中的邏輯,有且只有?句的情況下,?括號可以省略

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

    return的精簡

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

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

    三、函數引用

    lambda表達式是為了簡化接口的實現的。在lambda表達式中,不應該出現比較復雜的邏輯。如果在lambda表達式中出現了過于復雜的邏輯,會對程序的可讀性造成非常大的影響。如果在lambda表達式中需要處理的邏輯比較復雜,?般情況會單獨的寫?個方法。在lambda表達式中直接引用這個方法即可。

    函數引用:引用?個已經存在的方法,使其替代lambda表達式完成接口的實現

    1.靜態方法的引用

    語法:類::靜態方法

    注意事項:

    • 在引用的方法后面,不要添加小括號。

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

    package test;
    /**
     * @author: Mercury
     * Date: 2022/3/20
     * Time: 18:17
     * Description:lambda表達式靜態方法引用
     * Version:1.0
     */
    public class Test05 {
        public static void main(String[] args) {
            //實現多個參數,一個返回值的接口
            //對一個靜態方法的引用,語法:類::靜態方法
            Test1 test1 = Calculator::calculate;
            System.out.println(test1.test(4,5));
        }
    }
    class Calculator{
        public static int calculate(int a,int b ){
            // 稍微復雜的邏輯:計算a和b的差值的絕對值
            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表達式靜態方法引用
     * Version:1.0
     */
    public class Test05 {
        public static void main(String[] args) {
            //實現多個參數,一個返回值的接口
            //對一個靜態方法的引用,語法:類::靜態方法
            Test1 test1 = Calculator::calculate;
            System.out.println(test1.test(4,5));
        }
    }
    class Calculator{
        public static int calculate(int a,int b ){
            // 稍微復雜的邏輯:計算a和b的差值的絕對值
            if (a > b) {
                return a - b;
            }
            return b - a;
        }
    }
    interface Test1{
        int test(int a,int b);
    }

    2.非靜態方法的引用

    語法:對象::非靜態方法

    注意事項:

    • 在引用的方法后?,不要添加小括號。

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

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

    使用場景

    如果某?個函數式接口中定義的方法,僅僅是為了得到?個類的對象。此時我們就可以使用構造方法的引用,簡化這個方法的實現。

    語法:類名::new

    注意事項:可以通過接口中的方法的參數, 區分引用不同的構造方法。

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

    四、Lambda表達式需要注意的問題

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

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

    到此,關于“Java中Lambda表達式使用的方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    沙湾县| 新晃| 广汉市| 敖汉旗| 竹溪县| 二连浩特市| 平泉县| 永清县| 四川省| 珲春市| 荆州市| 宣化县| 田东县| 平遥县| 江永县| 昔阳县| 日照市| 余庆县| 黑山县| 慈溪市| 灌南县| 宜宾市| 临潭县| 龙井市| 娱乐| 三都| 隆安县| 沅江市| 天全县| 万州区| SHOW| 鄄城县| 湘潭市| 恩施市| 图木舒克市| 百色市| 临澧县| 齐河县| 青川县| 慈溪市| 井研县|