欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java8中的Lambda表達(dá)式理解與使用示例詳解

 更新時間:2024年11月27日 17:02:36   作者:興趣廣泛的程序猿  
Lambda表達(dá)式是Java8引入的一種簡潔寫法,用于實現(xiàn)函數(shù)式接口,可以簡化匿名函數(shù)的代碼,本文給大家介紹Java8中的Lambda表達(dá)式理解與使用示例,感興趣的朋友一起看看吧

一、什么是Lambda表達(dá)式

        Lambda表達(dá)式是Java 8引入的一個特性,它允許你以匿名函數(shù)的方式寫出更簡潔的代碼,所以說,也可以理解為它和特定匿名函數(shù)是一個意思,只是寫法上不同,更加的簡潔(當(dāng)然看不習(xí)慣的反而可能覺得復(fù)雜)。

        Lambda表達(dá)式的基本語法是 (parameters) -> expression,其中 -> 表示將參數(shù)映射到表達(dá)式上。

        Lambda表達(dá)式可以用于實現(xiàn)函數(shù)式接口,即只包含一個抽象方法接口‌。

        上面紅色字體說明了Lambda表達(dá)式與普通匿名函數(shù)的區(qū)別,它所需要的條件比較嚴(yán)格,并不適合簡化所有的匿名函數(shù)。

二、Lambda表達(dá)式和匿名函數(shù)的差別

        上面已經(jīng)說明了Lambda表達(dá)式和匿名函數(shù)一樣,都可以實現(xiàn)函數(shù)式接口,但只能是包含唯一一個抽象方法的,并且是接口interface類。

public class LambdaTest {
	public static void main(String[] args) {
        checkId1("1", User::getUserIdStatic); //使用引用類靜態(tài)方法,得到的id與User類靜態(tài)值有關(guān)
        User user = new User("2");
        checkId1("1", user::getUserId); //使用引用實例對象方法,得到的id與user實例有關(guān)
        checkId1("1", ()-> user.getUserId()); //使用正常Lambda表達(dá)式(簡化了{(lán)}和return),->后加上{}可以正常編寫方法實現(xiàn)內(nèi)容
        checkId2("1", new ICommonFun(){ //使用匿名函數(shù),因為這個接口的抽象方法數(shù)量大于1個
            @Override
            public String getId() {
                return user.getUserId();
            }
            @Override
            public void setId(String id) {
            }
        });
    }
    public static void checkId1(String id, ILambdaFun iLambdaFun){
        if (id.equals(iLambdaFun.getId())){
            System.out.println("id相等");
        }else{
            System.out.println("id不相等");
        }
    }
    public static void checkId2(String id, ICommonFun iCommonFun){
        if (id.equals(iCommonFun.getId())){
            System.out.println("id相等");
        }else{
            System.out.println("id不相等");
        }
    }
    interface ILambdaFun {
        String getId(); // 方法參數(shù)數(shù)量為0個,所以lambda表達(dá)式為()->{}
    }
    interface ICommonFun {
        String getId();
        void setId(String id); //多了這個方法,所以無法使用Lambda表達(dá)式來實現(xiàn)這個接口。去掉或改為非抽象方法才可以使用Lambda表達(dá)式來實現(xiàn)這個接口。
    }
    static class User {
        private String id;
        private static String idStatic = "1";
        User(String id){
            this.id = id;
        }
        private String getUserId () {
            return id;
        }
        private static String getUserIdStatic () {
            return idStatic;
        }
    }
}
// 運行結(jié)果
//id相等
//id不相等
//id不相等
//id不相等

三、Lambda表達(dá)式的4種方法引用

        上面的代碼例子中,在使用Lambda表達(dá)式時,使用了2種方法引用,和Lambda正常表達(dá)式。Lambda表達(dá)式總共有4種方法引用:

1,靜態(tài)方法引用(上面代碼例子有使用過)

2,實例方法引用(上面代碼例子有使用過)

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

4,特殊方法引用

第一種:靜態(tài)方法引用

引用語法:類名::方法名,如User::getIdStatic()

注意事項:
        函數(shù)式接口(interface類)中抽象方法參數(shù)列表是什么樣的,被引用的方法參數(shù)列表也要是一樣的;
        接口的抽象方法沒有返回值,被引用的方法返回值可有可無;
        接口的抽象方法有返回值,被引用的方法必須有相同類型的返回值。

第二種:實例方法引用

引用語法:對象名::非靜態(tài)方法名,如:user::getId()

注意事項:
        函數(shù)式接口(interface類)中抽象方法參數(shù)列表是什么樣的,被引用的方法參數(shù)列表也要是一樣的;

        接口的抽象方法沒有返回值,被引用的方法返回值可有可無;

        接口的抽象方法有返回值,引用的方法必須有相同類型的返回值。

第三種:構(gòu)造方法引用

引用語法:類名::new,如:String::new

注意事項:
        函數(shù)式接口(interface類)中抽象方法參數(shù)列表是什么樣的,被引用的構(gòu)造方法參數(shù)列表也要是一樣的。

第四種:特殊方法引用

引用語法:類名::實例方法名,如User::getId()

注意事項:
        在抽象方法中,第一個參數(shù)可以作為被引用的實例方法(如getId())的調(diào)用者(如User實例對象),就可以簡化。所以這種抽象方法必須有至少一個參數(shù),且第一個參數(shù)是可以調(diào)用實例方法的對象;除去第一個參數(shù)的其余參數(shù)組成的參數(shù)列表,在第一個參數(shù)代表的對象類里,必須有對應(yīng)的非靜態(tài)實例方法。(如,抽象方法為void setObject(User user,String v1),則User類里必須有fun(String v1)方法,方法返回值同第一二種要求。)

public class LambdaTest {
    public static void main(String[] args) {
        checkId1("1", User::getUserId); // 看著像引用靜態(tài)方法
    }
    public static void checkId1(String id, ILambdaFun iLambdaFun){
        if (id.equals(iLambdaFun.getObject(new User("1")))){ // 使用函數(shù)實例的抽象方法時,需要根據(jù)參數(shù)傳入實例對象
            System.out.println("id相等");
        }else{
            System.out.println("id不相等");
        }
    }
    interface ILambdaFun {
        Object getObject(User user); // 抽象方法里有且只有一個參數(shù)
    }
    static class User {
        private String id;
        private static String idStatic = "1";
        User(String id){
            this.id = id;
        }
        private String getUserId () {
            return id;
        }
        private static String getUserIdStatic () {
            return idStatic;
        }
    }
}

四、拓展

        Java中一些可使用Lambda表達(dá)式的接口

  • Consumer<T>:接受一個輸入?yún)?shù)并不返回結(jié)果。
  • Supplier<T>:不接受任何參數(shù),返回一個結(jié)果。
  • Function<T, R>:接受一個參數(shù)并返回一個結(jié)果。
  • Predicate<T>:接受一個參數(shù),返回一個布爾值。
public class LambdaTest {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        User user1 = new User("1");
        userList.add(user1);
        userList.add(new User("2"));
        HashMap<String,User> map = listToMap(userList, User::getUserId); //需要其它屬性值作為Map的Key,直接換一個引用方法即可
        System.out.println(map.get("1"));
        System.out.println(map.get("2"));
    }
    public static HashMap<String, User> listToMap(List<User> userList, Function<User, String> function){
        HashMap<String, User> userMap = new HashMap<>();
        userList.forEach((item)->{
            userMap.put(function.apply(item), item);
        });
        return userMap;
    }
    public static class User {
        private String id;
        private static String idStatic = "1";
        User(String id){
            this.id = id;
        }
        private String getUserId () {
            return id;
        }
        private static String getUserIdStatic () {
            return idStatic;
        }
        @Override
        public String toString() {
            return "User{id:"+id+"}";
        }
    }
}
// 運行結(jié)果
//User{id:1}
//User{id:2}

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

相關(guān)文章

  • 淺談Spring Boot: 接口壓測及簡要優(yōu)化策略

    淺談Spring Boot: 接口壓測及簡要優(yōu)化策略

    這篇文章主要介紹了淺談Spring Boot: 接口壓測及簡要優(yōu)化策略,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • spring boot設(shè)置過濾器、監(jiān)聽器及攔截器的方法

    spring boot設(shè)置過濾器、監(jiān)聽器及攔截器的方法

    這篇文章主要給大家介紹了關(guān)于spring boot設(shè)置過濾器、監(jiān)聽器及攔截器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • springcloud配置ssh的問題及解決方法

    springcloud配置ssh的問題及解決方法

    這篇文章主要介紹了springcloud配置ssh,本文給大家介紹在配置過程中遇到的問題及解決方法,通過結(jié)合實例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Feign調(diào)用傳輸文件異常的解決

    Feign調(diào)用傳輸文件異常的解決

    這篇文章主要介紹了Feign調(diào)用傳輸文件異常的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 詳解springmvc如何處理接受http請求

    詳解springmvc如何處理接受http請求

    這篇文章主要給大家介紹了springmvc如何處理接受http請求,文中通過代碼示例給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Java面試題之MD5加密的安全性詳解

    Java面試題之MD5加密的安全性詳解

    MD5 是 Message Digest Algorithm 的縮寫,譯為信息摘要算法,它是 Java 語言中使用很廣泛的一種加密算法。本文將通過示例討論下MD5的安全性,感興趣的可以了解一下
    2022-10-10
  • java設(shè)計模式學(xué)習(xí)之策略模式

    java設(shè)計模式學(xué)習(xí)之策略模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計模式學(xué)習(xí)之策略模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • java中使用session監(jiān)聽實現(xiàn)同帳號登錄限制、登錄人數(shù)限制

    java中使用session監(jiān)聽實現(xiàn)同帳號登錄限制、登錄人數(shù)限制

    本文主要介紹了java中使用session監(jiān)聽實現(xiàn)同帳號登錄限制、登錄人數(shù)限制,通過session來監(jiān)聽在線人數(shù)和登陸限制,有需要的童鞋可以了解一下。
    2016-10-10
  • Java基礎(chǔ)知識之I/O流和File類文件操作

    Java基礎(chǔ)知識之I/O流和File類文件操作

    眾所周知java語言提供給程序員非常多的包供編程時使用,方便又快捷,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)知識之I/O流和File類文件操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 如何修改FeginCilent定義的服務(wù)名到指定服務(wù)

    如何修改FeginCilent定義的服務(wù)名到指定服務(wù)

    這篇文章主要介紹了修改FeginCilent定義的服務(wù)名到指定服務(wù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論