成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

lambda表達(dá)式一,介紹

ybak / 3224人閱讀

摘要:體驗的更優(yōu)寫法借助的全新語法,上述接口的匿名內(nèi)部類寫法可以通過更簡單的表達(dá)式達(dá)到等效多線程任務(wù)執(zhí)行啟動線程這段代碼和剛才的執(zhí)行效果是完全一樣的,可以在或更高的編譯級別下通過。

jdk8 2014年加入了lambda表達(dá)式
實例代碼

第三章 Lambda表達(dá)式 3.1 函數(shù)式編程思想概述

在數(shù)學(xué)中,函數(shù)就是有輸入量、輸出量的一套計算方案,也就是“拿什么東西做什么事情”。相對而言,面向?qū)ο筮^分強調(diào)“必須通過對象的形式來做事情”,而函數(shù)式思想則盡量忽略面向?qū)ο蟮膹?fù)雜語法——強調(diào)做什么,而不是以什么形式做

面向?qū)ο蟮乃枷?

? 做一件事情,找一個能解決這個事情的對象,調(diào)用對象的方法,完成事情.

函數(shù)式編程思想:

? 只要能獲取到結(jié)果,誰去做的,怎么做的都不重要,重視的是結(jié)果,不重視過程

3.2 冗余的Runnable代碼 傳統(tǒng)寫法

當(dāng)需要啟動一個線程去完成任務(wù)時,通常會通過java.lang.Runnable接口來定義任務(wù)內(nèi)容,并使用java.lang.Thread類來啟動該線程。代碼如下:

public class Demo01Runnable {
    public static void main(String[] args) {
        // 匿名內(nèi)部類
        Runnable task = new Runnable() {
            @Override
            public void run() { // 覆蓋重寫抽象方法
                System.out.println("多線程任務(wù)執(zhí)行!");
            }
        };
        new Thread(task).start(); // 啟動線程
    }
}

本著“一切皆對象”的思想,這種做法是無可厚非的:首先創(chuàng)建一個Runnable接口的匿名內(nèi)部類對象來指定任務(wù)內(nèi)容,再將其交給一個線程來啟動。

代碼分析

對于Runnable的匿名內(nèi)部類用法,可以分析出幾點內(nèi)容:

Thread類需要Runnable接口作為參數(shù),其中的抽象run方法是用來指定線程任務(wù)內(nèi)容的核心;

為了指定run的方法體,不得不需要Runnable接口的實現(xiàn)類;

為了省去定義一個RunnableImpl實現(xiàn)類的麻煩,不得不使用匿名內(nèi)部類;

必須覆蓋重寫抽象run方法,所以方法名稱、方法參數(shù)、方法返回值不得不再寫一遍,且不能寫錯;

而實際上,似乎只有方法體才是關(guān)鍵所在

3.3 編程思想轉(zhuǎn)換 做什么,而不是怎么做

我們真的希望創(chuàng)建一個匿名內(nèi)部類對象嗎?不。我們只是為了做這件事情而不得不創(chuàng)建一個對象。我們真正希望做的事情是:將run方法體內(nèi)的代碼傳遞給Thread類知曉。

傳遞一段代碼——這才是我們真正的目的。而創(chuàng)建對象只是受限于面向?qū)ο笳Z法而不得不采取的一種手段方式。那,有沒有更加簡單的辦法?如果我們將關(guān)注點從“怎么做”回歸到“做什么”的本質(zhì)上,就會發(fā)現(xiàn)只要能夠更好地達(dá)到目的,過程與形式其實并不重要。

生活舉例

當(dāng)我們需要從北京到上海時,可以選擇高鐵、汽車、騎行或是徒步。我們的真正目的是到達(dá)上海,而如何才能到達(dá)上海的形式并不重要,所以我們一直在探索有沒有比高鐵更好的方式——搭乘飛機(jī)。

而現(xiàn)在這種飛機(jī)(甚至是飛船)已經(jīng)誕生:2014年3月Oracle所發(fā)布的Java 8(JDK 1.8)中,加入了Lambda表達(dá)式的重量級新特性,為我們打開了新世界的大門。

3.4 體驗Lambda的更優(yōu)寫法

借助Java 8的全新語法,上述Runnable接口的匿名內(nèi)部類寫法可以通過更簡單的Lambda表達(dá)式達(dá)到等效:

public class Demo02LambdaRunnable {
    public static void main(String[] args) {
        new Thread(() -> System.out.println("多線程任務(wù)執(zhí)行!")).start(); // 啟動線程
    }
}

這段代碼和剛才的執(zhí)行效果是完全一樣的,可以在1.8或更高的編譯級別下通過。從代碼的語義中可以看出:我們啟動了一個線程,而線程任務(wù)的內(nèi)容以一種更加簡潔的形式被指定。

不再有“不得不創(chuàng)建接口對象”的束縛,不再有“抽象方法覆蓋重寫”的負(fù)擔(dān),就是這么簡單!

3.5 回顧匿名內(nèi)部類

Lambda是怎樣擊敗面向?qū)ο蟮??在上例中,核心代碼其實只是如下所示的內(nèi)容:

() -> System.out.println("多線程任務(wù)執(zhí)行!")

為了理解Lambda的語義,我們需要從傳統(tǒng)的代碼起步。

使用實現(xiàn)類

要啟動一個線程,需要創(chuàng)建一個Thread類的對象并調(diào)用start方法。而為了指定線程執(zhí)行的內(nèi)容,需要調(diào)用Thread類的構(gòu)造方法:

public Thread(Runnable target)

為了獲取Runnable接口的實現(xiàn)對象,可以為該接口定義一個實現(xiàn)類RunnableImpl

public class RunnableImpl implements Runnable {
    @Override
    public void run() {
        System.out.println("多線程任務(wù)執(zhí)行!");
    }
}

然后創(chuàng)建該實現(xiàn)類的對象作為Thread類的構(gòu)造參數(shù):

public class Demo03ThreadInitParam {
    public static void main(String[] args) {
        Runnable task = new RunnableImpl();
        new Thread(task).start();
    }
}
使用匿名內(nèi)部類

這個RunnableImpl類只是為了實現(xiàn)Runnable接口而存在的,而且僅被使用了唯一一次,所以使用匿名內(nèi)部類的語法即可省去該類的多帶帶定義,即匿名內(nèi)部類:

public class Demo04ThreadNameless {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("多線程任務(wù)執(zhí)行!");
            }
        }).start();
    }
}
匿名內(nèi)部類的好處與弊端

一方面,匿名內(nèi)部類可以幫我們省去實現(xiàn)類的定義;另一方面,匿名內(nèi)部類的語法——確實太復(fù)雜了!

語義分析

仔細(xì)分析該代碼中的語義,Runnable接口只有一個run方法的定義:

public abstract void run();

即制定了一種做事情的方案(其實就是一個函數(shù)):

無參數(shù):不需要任何條件即可執(zhí)行該方案。

無返回值:該方案不產(chǎn)生任何結(jié)果。

代碼塊(方法體):該方案的具體執(zhí)行步驟。

同樣的語義體現(xiàn)在Lambda語法中,要更加簡單:

() -> System.out.println("多線程任務(wù)執(zhí)行!")

前面的一對小括號即run方法的參數(shù)(無),代表不需要任何條件;

中間的一個箭頭代表將前面的參數(shù)傳遞給后面的代碼;

后面的輸出語句即業(yè)務(wù)邏輯代碼。

3.6 Lambda標(biāo)準(zhǔn)格式

Lambda省去面向?qū)ο蟮臈l條框框,格式由3個部分組成:

一些參數(shù)

一個箭頭

一段代碼

Lambda表達(dá)式的標(biāo)準(zhǔn)格式為:

(參數(shù)類型 參數(shù)名稱) -> { 代碼語句 }

格式說明:

小括號內(nèi)的語法與傳統(tǒng)方法參數(shù)列表一致:無參數(shù)則留空;多個參數(shù)則用逗號分隔。

->是新引入的語法格式,代表指向動作。

大括號內(nèi)的語法與傳統(tǒng)方法體要求基本一致。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75997.html

相關(guān)文章

  • 轉(zhuǎn) | Java8初體驗(lambda達(dá)式語法

    摘要:初體驗下面進(jìn)入本文的正題表達(dá)式。接下來展示表達(dá)式和其好基友的配合。吐槽一下方法引用表面上看起來方法引用和構(gòu)造器引用進(jìn)一步簡化了表達(dá)式的書寫,但是個人覺得這方面沒有的下劃線語法更加通用。 感謝同事【天錦】的投稿。投稿請聯(lián)系 [email protected] 本文主要記錄自己學(xué)習(xí)Java8的歷程,方便大家一起探討和自己的備忘。因為本人也是剛剛開始學(xué)習(xí)Java8,所以文中肯定有錯誤和理解偏...

    Lucky_Boy 評論0 收藏0
  • 深入淺出 Java 8 Lambda 達(dá)式

    摘要:在支持一類函數(shù)的語言中,表達(dá)式的類型將是函數(shù)。匿名函數(shù)的返回類型與該主體表達(dá)式一致如果表達(dá)式的主體包含一條以上語句,則表達(dá)式必須包含在花括號中形成代碼塊。注意,使用表達(dá)式的方法不止一種。 摘要:此篇文章主要介紹 Java8 Lambda 表達(dá)式產(chǎn)生的背景和用法,以及 Lambda 表達(dá)式與匿名類的不同等。本文系 OneAPM 工程師編譯整理。 Java 是一流的面向?qū)ο笳Z言,除了部分簡...

    wdzgege 評論0 收藏0
  • Java8新特性第1章(Lambda達(dá)式)

    摘要:一表達(dá)式匿名內(nèi)部類最大的問題在于其冗余的語法,比如前面的中五行代碼僅有一行是在執(zhí)行任務(wù)??偨Y(jié)基于詞法作用域的理念,表達(dá)式不可以掩蓋任何其所在上下文的局部變量。 轉(zhuǎn)載請注明出處:https://zhuanlan.zhihu.com/p/20540175 在介紹Lambda表達(dá)式之前,我們先來看只有單個方法的Interface(通常我們稱之為回調(diào)接口): public interface...

    ningwang 評論0 收藏0
  • Java8-1-初識Lambda達(dá)式與函數(shù)式接口

    摘要:而在中,表達(dá)式是對象,它們必須依附于一類特別的對象類型函數(shù)式接口。即表達(dá)式返回的是函數(shù)式接口類型。 Java8被稱作Java史上變化最大的一個版本。其中包含很多重要的新特性,最核心的就是增加了Lambda表達(dá)式和Stream API。這兩者也可以結(jié)合在一起使用。首先來看下什么是Lambda表達(dá)式。Lambda表達(dá)式,維基百科上的解釋是一種用于表示匿名函數(shù)和閉包的運算符,感覺看到這個解釋...

    jzman 評論0 收藏0
  • Java Lambda 達(dá)式(又名閉包 (Closure)/ 匿名函數(shù) ) 筆記

    摘要:表達(dá)式又名閉包匿名函數(shù)筆記根據(jù)終于在中引入了表達(dá)式。函數(shù)式接口要介紹中表達(dá)式的實現(xiàn),需要知道什么是函數(shù)式接口。但同樣需要保證外部的自由變量不能在表達(dá)式中被改變。 Java Lambda 表達(dá)式(又名閉包 (Closure)/ 匿名函數(shù) ) 筆記 根據(jù) JSR 335, Java 終于在 Java 8 中引入了 Lambda 表達(dá)式。也稱之為閉包或者匿名函數(shù)。 showImg(https...

    fou7 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<