亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java Lambda表達(dá)式的使用心得

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

Lambda表達(dá)式的心得

如題,因?yàn)椴┲饕彩亲罱沤佑|到Lambda表達(dá)式的(PS 在這里汗顏一會(huì))。我并不會(huì)講解它的原理,誠(chéng)然任何一件事物如果理解原理的話,使用它必將更加容易。但博主在學(xué)習(xí)的時(shí)候,大多數(shù)時(shí)候都是學(xué)會(huì)怎么用,然后在細(xì)究原理。就像你騎自行車之前,難道首先還要研究自行車的原理么?

首先Lambda表達(dá)式的最簡(jiǎn)單應(yīng)用如下

Lambda表達(dá)式法

        String lam= "初次相識(shí)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é)果

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

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

首先,我定義了一個(gè)自定義的接口,可以用來(lái)測(cè)試

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

使用Lambda表達(dá)式 你首先要知道的

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

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

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

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

你可以發(fā)現(xiàn)后面的大括號(hào){ }沒(méi)了,這是因?yàn)楹竺娲a如果只有一句的話,是可以省略{ } 的

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

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

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

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

你又會(huì)發(fā)現(xiàn),前面的()中括號(hào)也沒(méi)了,這是因?yàn)楫?dāng)參數(shù)只有一個(gè)的時(shí)候,是可以省略()的。

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

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

輸出結(jié)果如下

當(dāng)然你還會(huì)問(wèn)Lambda表達(dá)式能不能返回東西呢?這是肯定能的,首先我們?cè)侔焉厦娴腖am接口方法修改一下

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

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

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

運(yùn)行的結(jié)果:

總結(jié) Lambda表達(dá)式 就是用來(lái)創(chuàng)建一個(gè)匿名的接口對(duì)象,即 它本身就是一個(gè)接口的匿名實(shí)例。只不過(guò)這個(gè)接口 有一些條件限制。

Lambda表達(dá)式的技巧

Lambda表達(dá)式只能用來(lái)簡(jiǎn)化僅包含一個(gè)public方法的接口的創(chuàng)建

規(guī)則

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

括號(hào)形式

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

public class Go {
    public static void main(String a[]) {
        //正確示范
        testA((int i, int j) -> {});
        //錯(cuò)誤示范:Multiple non-overriding abstract methods found xxx;只能有一個(gè)public方法
        testB((int i, int j) -> {});
        //錯(cuò)誤示范: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);
    }
}

雙冒號(hào)表達(dá)形式

  • 雙冒號(hào)后面必須是靜態(tài)方法
    • 否則報(bào)錯(cuò):Non-static method cannot be referenced from a static context
  • 雙冒號(hào)后面的方法與接口方法參數(shù)一樣
  • 方法與接口的權(quán)限可以不一樣
  • 返回類型:如果接口里面方法是void,雙冒號(hào)后的方法可以任意返回類型,否則要一致
public class Go {
    public static void main(String a[]) {
        //之前的寫法
        testA(new AInterface() {
            @Override
            public void xxx(int i, int j) {
                
            }
        });
        //正確,相對(duì)與接口里面xxx方這是改成靜態(tài)和換了個(gè)名字
        testA(Go::mydog);
        //正確,加了返回類型和public換成private,也是ok
        testA(Go::mydog2);
        
        //錯(cuò)誤: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);
    }
}

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

相關(guān)文章

  • IDEA?中使用?Hudi的示例代碼

    IDEA?中使用?Hudi的示例代碼

    這篇文章主要介紹了IDEA?中使用?Hudi的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 學(xué)習(xí)Java設(shè)計(jì)模式之觀察者模式

    學(xué)習(xí)Java設(shè)計(jì)模式之觀察者模式

    這篇文章主要為大家介紹了Java設(shè)計(jì)模式中的觀察者模式,對(duì)Java設(shè)計(jì)模式感興趣的小伙伴們可以參考一下
    2016-01-01
  • mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見(jiàn)的使用方法

    mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見(jiàn)的使用方法

    MyBatis-Plus是一個(gè)?MyBatis?(opens?new?window)的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,這篇文章主要介紹了mybaits-plus?lambdaQuery()?和?lambdaUpdate()?比較常見(jiàn)的使用方法,需要的朋友可以參考下
    2023-01-01
  • springboot+dubbo+zookeeper的簡(jiǎn)單實(shí)例詳解

    springboot+dubbo+zookeeper的簡(jiǎn)單實(shí)例詳解

    本文主要介紹了springboot+dubbo+zookeeper的簡(jiǎn)單實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • MyBatis 添加元數(shù)據(jù)自定義元素標(biāo)簽的實(shí)現(xiàn)代碼

    MyBatis 添加元數(shù)據(jù)自定義元素標(biāo)簽的實(shí)現(xiàn)代碼

    這篇文章主要介紹了MyBatis 添加元數(shù)據(jù)自定義元素標(biāo)簽的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 詳細(xì)了解MVC+proxy

    詳細(xì)了解MVC+proxy

    Java有兩種代理方式,一種是靜態(tài)代理,另一種是動(dòng)態(tài)代理。對(duì)于靜態(tài)代理,其實(shí)就是通過(guò)依賴注入,對(duì)對(duì)象進(jìn)行封裝,不讓外部知道實(shí)現(xiàn)的細(xì)節(jié)。很多 API 就是通過(guò)這種形式來(lái)封裝的
    2021-07-07
  • Java 靜態(tài)數(shù)據(jù)初始化的示例代碼

    Java 靜態(tài)數(shù)據(jù)初始化的示例代碼

    這篇文章主要介紹了Java 靜態(tài)數(shù)據(jù)初始化的示例代碼,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Java中獲取文件大小的詳解及實(shí)例代碼

    Java中獲取文件大小的詳解及實(shí)例代碼

    這篇文章主要介紹了Java中獲取文件大小的詳解及實(shí)例代碼的相關(guān)資料,一種是使用File的length()方法,另外一種是使用FileInputStream的available()方法,這里就說(shuō)下如何使用需要的朋友可以參考下
    2016-12-12
  • 詳解Java實(shí)踐之抽象工廠模式

    詳解Java實(shí)踐之抽象工廠模式

    抽象工廠模式用于產(chǎn)品族的構(gòu)建。抽象工廠是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠是指當(dāng)有多個(gè)抽象角色時(shí)使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個(gè)接口,使客戶端在不必指定產(chǎn)品的具體情況下,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象
    2021-06-06
  • Java實(shí)戰(zhàn)之兼職平臺(tái)系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之兼職平臺(tái)系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了如何利用Java編寫一個(gè)兼職平臺(tái)系統(tǒng),采用到的技術(shù)有Springboot、SpringMVC、MyBatis、ThymeLeaf等,感興趣的小伙伴可以了解一下
    2022-03-03

最新評(píng)論