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

java Lambda表達式的使用心得

 更新時間:2021年10月11日 15:33:18   作者:知我飯否  
這篇文章主要介紹了java Lambda表達式的使用心得,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Lambda表達式的心得

如題,因為博主也是最近才接觸到Lambda表達式的(PS 在這里汗顏一會)。我并不會講解它的原理,誠然任何一件事物如果理解原理的話,使用它必將更加容易。但博主在學習的時候,大多數(shù)時候都是學會怎么用,然后在細究原理。就像你騎自行車之前,難道首先還要研究自行車的原理么?

首先Lambda表達式的最簡單應用如下

Lambda表達式法

        String lam= "初次相識Lambda";
        new Thread(() -> System.out.println(lam)).start();

傳統(tǒng)方法

  String tradition="傳統(tǒng)方法";
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(tradition);
            }
        }).start();

輸出結(jié)果

很簡潔有沒有?省略了好多代碼是不是,在這里 你可以發(fā)現(xiàn)”,Lambda表達式和在Thread創(chuàng)建一個匿名類的作用是一樣。我們可以這樣認為Lambda表達式本身代表了一個匿名類。

這就是Lambda最大的作用,當然Lambda表達式只能創(chuàng)建接口interface對象。 創(chuàng)建類是不行的,抽象類也是不行的 ,只要是類都是不行的。

首先,我定義了一個自定義的接口,可以用來測試

@FunctionalInterface
public interface Lam {
    //Lambda表達式調(diào)用的方法
    void bda();
    
    //接口的默認方法
    default void test(){
        System.out.println("我是默認的方法");
    };
    //接口的靜態(tài)方法
    static void test1(){
        System.out.println("我是靜態(tài)方法");
    }
}

使用Lambda表達式 你首先要知道的

1.Lambda表達式只能是接口 interface的創(chuàng)建(PS從上面的例子可以看出來,Runnable是接口,可以查看源代碼),并且這個接口只能包含一個方法(除了default方法和static方法)。在接口中創(chuàng)建default方法和static方法都必須要實現(xiàn)方法體如下圖

2.如果你用Lambda表達式來創(chuàng)建類 class,則會出現(xiàn)以下錯誤 ”Target type of a lambda conversion must be an interface“如果你怕自己的定義的接口不符合Lambda表達式的規(guī)范 ,你可以在接口interfaca 上面添加注解@FunctionalInterface

3.Lambda表達式的規(guī)范表示格式 (parameters) ->{ statements; }。在某些時刻,你還可以簡化這個格式

  //接口定義的方法無參數(shù)時候,并且你想要執(zhí)行操作也只有一句代碼的時候,Lambda會自動返回一句代碼,并且可以不用加{}
        Lam lam1=()->System.out.println("無參數(shù)");

你可以發(fā)現(xiàn)后面的大括號{ }沒了,這是因為后面代碼如果只有一句的話,是可以省略{ } 的

我們把Lam接口定義的調(diào)用方法參數(shù)修改一下,多出了一個String類型的形參s

 //Lambda表達式調(diào)用的方法
    void bda(String s);

這時候 我們?nèi)绻褂肔ambda表達式,則可以這樣

//接口定義的方法有參數(shù)時候,并且你想要執(zhí)行的操作也只有一句代碼的時候
        Lam lam1=e->System.out.println(e);//這一句還有簡化版本  Lam lam1=System.out::println;
        lam1.bda("4556");

你又會發(fā)現(xiàn),前面的()中括號也沒了,這是因為當參數(shù)只有一個的時候,是可以省略()的。

當然也有你要執(zhí)行很多代碼的時候,那這時候可以這樣

 //接口定義的方法有參數(shù)時候,并且你想要執(zhí)行的操作有很多句代碼的時候
        Lam lam1 = (String e) -> {
            String a = e + "add";
            System.out.println(a);
        };
        lam1.bda("test+");

輸出結(jié)果如下

當然你還會問Lambda表達式能不能返回東西呢?這是肯定能的,首先我們再把上面的Lam接口方法修改一下

 //Lambda表達式調(diào)用的方法
    String bda(String s);

讓bda方法返回一個String值,這次如果我們用Lambda的話

//接口定義的方法有返回值的時候
        Lam lam1=s ->{System.out.println(s);return "我是返回的數(shù)據(jù)";};
        lam1.bda("test1");
        System.out.println(lam1.bda("test2"));

運行的結(jié)果:

總結(jié) Lambda表達式 就是用來創(chuàng)建一個匿名的接口對象,即 它本身就是一個接口的匿名實例。只不過這個接口 有一些條件限制。

Lambda表達式的技巧

Lambda表達式只能用來簡化僅包含一個public方法的接口的創(chuàng)建

規(guī)則

  • 1.只能是接口
    • 否則報:Target type of a lambda conversion must be an interface
  • 2.只能有一個public方法
    • 否則報:Multiple non-overriding abstract methods found AInterface
    • 或AInterface is not a functional interface

括號形式

testA((int i, int j) -> {});參數(shù)要與接口一致

public class Go {
    public static void main(String a[]) {
        //正確示范
        testA((int i, int j) -> {});
        //錯誤示范:Multiple non-overriding abstract methods found xxx;只能有一個public方法
        testB((int i, int j) -> {});
        //錯誤示范:Target type of a lambda conversion must be an interface;只能是接口
        testC((int i, int j) -> {});
    }
    public static void testA(AInterface t) {    }
    public static void testC(CInterface t) {}
    public static void testB(BInterface t) {}
    interface AInterface {
        void xxx(int i, int j);
    }
    interface BInterface {
        void xxx(int i, int j);
        void YYY(int i, int j);
    }
    abstract class CInterface {
        abstract void xxx(int i, int j);
    }
}

雙冒號表達形式

  • 雙冒號后面必須是靜態(tài)方法
    • 否則報錯:Non-static method cannot be referenced from a static context
  • 雙冒號后面的方法與接口方法參數(shù)一樣
  • 方法與接口的權(quán)限可以不一樣
  • 返回類型:如果接口里面方法是void,雙冒號后的方法可以任意返回類型,否則要一致
public class Go {
    public static void main(String a[]) {
        //之前的寫法
        testA(new AInterface() {
            @Override
            public void xxx(int i, int j) {
                
            }
        });
        //正確,相對與接口里面xxx方這是改成靜態(tài)和換了個名字
        testA(Go::mydog);
        //正確,加了返回類型和public換成private,也是ok
        testA(Go::mydog2);
        
        //錯誤:Non-static method cannot be referenced from a static context
        testA(Go::mydog3);
        //這樣寫也是ok的。
        AInterface aInterface = Go::mydog;
        testA(aInterface);
    }
    public static void testA(AInterface t) {
        t.xxx(1, 2);
    }
    interface AInterface {
        void xxx(int i, int j);
    }
    public static boolean mydog(int i, int j) {
        System.out.println("mydog" + i + " & " + j);
        return false;
    }
    private static void mydog2(int i, int j) {
        System.out.println("mydo2" + i + " & " + j);
    }
    public void mydog3(int i, int j) {
        System.out.println("mydog3" + i + " & " + j);
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Spring CROS解決項目中的跨域問題詳解

    使用Spring CROS解決項目中的跨域問題詳解

    這篇文章主要介紹了使用Spring CROS解決項目中的跨域問題詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • java synchronized實現(xiàn)可見性過程解析

    java synchronized實現(xiàn)可見性過程解析

    這篇文章主要介紹了java synchronized實現(xiàn)可見性過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • springboot默認日志框架選擇源碼解析(推薦)

    springboot默認日志框架選擇源碼解析(推薦)

    這篇文章主要介紹了springboot默認日志框架選擇源碼解析(推薦),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Socket結(jié)合線程池使用實現(xiàn)客戶端和服務端通信demo

    Socket結(jié)合線程池使用實現(xiàn)客戶端和服務端通信demo

    這篇文章主要為大家介紹了Socket結(jié)合線程池的使用來實現(xiàn)客戶端和服務端通信實戰(zhàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • java單例模式實現(xiàn)的方法

    java單例模式實現(xiàn)的方法

    這篇文章主要介紹了如何在JAVA中實現(xiàn)單例模式,文中代碼簡單易懂,供大家參考學習,感興趣的小伙伴可以了解下
    2020-06-06
  • Java中String類常用類型實例總結(jié)

    Java中String類常用類型實例總結(jié)

    在我們開發(fā)中經(jīng)常會用到很多的常用的工具類,這里做一個總結(jié),下面這篇文章主要給大家介紹了關(guān)于Java中String類常用類型的相關(guān)資料,String類代表字符串,需要的朋友可以參考下
    2021-12-12
  • 詳解設計模式中的proxy代理模式及在Java程序中的實現(xiàn)

    詳解設計模式中的proxy代理模式及在Java程序中的實現(xiàn)

    代理模式主要分為靜態(tài)代理和動態(tài)代理,使客戶端方面的使用者通過設置的代理來操作對象,下面來詳解設計模式中的proxy代理模式及在Java程序中的實現(xiàn)
    2016-05-05
  • Java中的Phaser使用詳解

    Java中的Phaser使用詳解

    這篇文章主要介紹了Java中的Phaser使用詳解,與其他障礙不同,注冊在phaser上進行同步的parties數(shù)量可能會隨時間變化,任務可以隨時進行注冊,需要的朋友可以參考下
    2023-11-11
  • 基于Java實現(xiàn)簡單的郵件群發(fā)功能

    基于Java實現(xiàn)簡單的郵件群發(fā)功能

    這篇文章主要為大家詳細介紹了如何利用Java語言編寫一個簡單的工具類,可以實現(xiàn)郵件群發(fā)功能。文中的示例代碼講解詳細,需要的可以參考一下
    2022-05-05
  • Spring Boot詳解配置文件有哪些作用與細則

    Spring Boot詳解配置文件有哪些作用與細則

    SpringBoot項目是一個標準的Maven項目,它的配置文件需要放在src/main/resources/下,其文件名必須為application,其存在兩種文件形式,分別是properties和yaml(或者yml)文件
    2022-07-07

最新評論

衡阳市| 云阳县| 临武县| 高雄市| 临澧县| 广灵县| 通州市| 长宁县| 和龙市| 天全县| 中江县| 张家界市| 黄山市| 榕江县| 西峡县| 松潘县| 遂溪县| 东乡| 会泽县| 珠海市| 天台县| 乌兰察布市| 永兴县| 包头市| 东光县| 东平县| 东乌珠穆沁旗| 慈溪市| 霍城县| 合川市| 北辰区| 越西县| 鹤峰县| 夏津县| 延川县| 靖宇县| 旬阳县| 彭阳县| 辽阳县| 江津市| 筠连县|