摘要:體驗的更優寫法借助的全新語法,上述接口的匿名內部類寫法可以通過更簡單的表達式達到等效多線程任務執行啟動線程這段代碼和剛才的執行效果是完全一樣的,可以在或更高的編譯級別下通過。
jdk8 2014年加入了lambda表達式
實例代碼
在數學中,函數就是有輸入量、輸出量的一套計算方案,也就是“拿什么東西做什么事情”。相對而言,面向對象過分強調“必須通過對象的形式來做事情”,而函數式思想則盡量忽略面向對象的復雜語法——強調做什么,而不是以什么形式做。
面向對象的思想:
? 做一件事情,找一個能解決這個事情的對象,調用對象的方法,完成事情.
函數式編程思想:
? 只要能獲取到結果,誰去做的,怎么做的都不重要,重視的是結果,不重視過程
3.2 冗余的Runnable代碼 傳統寫法當需要啟動一個線程去完成任務時,通常會通過java.lang.Runnable接口來定義任務內容,并使用java.lang.Thread類來啟動該線程。代碼如下:
public class Demo01Runnable { public static void main(String[] args) { // 匿名內部類 Runnable task = new Runnable() { @Override public void run() { // 覆蓋重寫抽象方法 System.out.println("多線程任務執行!"); } }; new Thread(task).start(); // 啟動線程 } }
本著“一切皆對象”的思想,這種做法是無可厚非的:首先創建一個Runnable接口的匿名內部類對象來指定任務內容,再將其交給一個線程來啟動。
代碼分析對于Runnable的匿名內部類用法,可以分析出幾點內容:
Thread類需要Runnable接口作為參數,其中的抽象run方法是用來指定線程任務內容的核心;
為了指定run的方法體,不得不需要Runnable接口的實現類;
為了省去定義一個RunnableImpl實現類的麻煩,不得不使用匿名內部類;
必須覆蓋重寫抽象run方法,所以方法名稱、方法參數、方法返回值不得不再寫一遍,且不能寫錯;
而實際上,似乎只有方法體才是關鍵所在。
3.3 編程思想轉換 做什么,而不是怎么做我們真的希望創建一個匿名內部類對象嗎?不。我們只是為了做這件事情而不得不創建一個對象。我們真正希望做的事情是:將run方法體內的代碼傳遞給Thread類知曉。
傳遞一段代碼——這才是我們真正的目的。而創建對象只是受限于面向對象語法而不得不采取的一種手段方式。那,有沒有更加簡單的辦法?如果我們將關注點從“怎么做”回歸到“做什么”的本質上,就會發現只要能夠更好地達到目的,過程與形式其實并不重要。
生活舉例當我們需要從北京到上海時,可以選擇高鐵、汽車、騎行或是徒步。我們的真正目的是到達上海,而如何才能到達上海的形式并不重要,所以我們一直在探索有沒有比高鐵更好的方式——搭乘飛機。
而現在這種飛機(甚至是飛船)已經誕生:2014年3月Oracle所發布的Java 8(JDK 1.8)中,加入了Lambda表達式的重量級新特性,為我們打開了新世界的大門。
3.4 體驗Lambda的更優寫法借助Java 8的全新語法,上述Runnable接口的匿名內部類寫法可以通過更簡單的Lambda表達式達到等效:
public class Demo02LambdaRunnable { public static void main(String[] args) { new Thread(() -> System.out.println("多線程任務執行!")).start(); // 啟動線程 } }
這段代碼和剛才的執行效果是完全一樣的,可以在1.8或更高的編譯級別下通過。從代碼的語義中可以看出:我們啟動了一個線程,而線程任務的內容以一種更加簡潔的形式被指定。
不再有“不得不創建接口對象”的束縛,不再有“抽象方法覆蓋重寫”的負擔,就是這么簡單!
3.5 回顧匿名內部類Lambda是怎樣擊敗面向對象的?在上例中,核心代碼其實只是如下所示的內容:
() -> System.out.println("多線程任務執行!")
為了理解Lambda的語義,我們需要從傳統的代碼起步。
使用實現類要啟動一個線程,需要創建一個Thread類的對象并調用start方法。而為了指定線程執行的內容,需要調用Thread類的構造方法:
public Thread(Runnable target)
為了獲取Runnable接口的實現對象,可以為該接口定義一個實現類RunnableImpl:
public class RunnableImpl implements Runnable { @Override public void run() { System.out.println("多線程任務執行!"); } }
然后創建該實現類的對象作為Thread類的構造參數:
public class Demo03ThreadInitParam { public static void main(String[] args) { Runnable task = new RunnableImpl(); new Thread(task).start(); } }使用匿名內部類
這個RunnableImpl類只是為了實現Runnable接口而存在的,而且僅被使用了唯一一次,所以使用匿名內部類的語法即可省去該類的多帶帶定義,即匿名內部類:
public class Demo04ThreadNameless { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.println("多線程任務執行!"); } }).start(); } }匿名內部類的好處與弊端
一方面,匿名內部類可以幫我們省去實現類的定義;另一方面,匿名內部類的語法——確實太復雜了!
語義分析仔細分析該代碼中的語義,Runnable接口只有一個run方法的定義:
public abstract void run();
即制定了一種做事情的方案(其實就是一個函數):
無參數:不需要任何條件即可執行該方案。
無返回值:該方案不產生任何結果。
代碼塊(方法體):該方案的具體執行步驟。
同樣的語義體現在Lambda語法中,要更加簡單:
() -> System.out.println("多線程任務執行!")
前面的一對小括號即run方法的參數(無),代表不需要任何條件;
中間的一個箭頭代表將前面的參數傳遞給后面的代碼;
后面的輸出語句即業務邏輯代碼。
3.6 Lambda標準格式Lambda省去面向對象的條條框框,格式由3個部分組成:
一些參數
一個箭頭
一段代碼
Lambda表達式的標準格式為:
(參數類型 參數名稱) -> { 代碼語句 }
格式說明:
小括號內的語法與傳統方法參數列表一致:無參數則留空;多個參數則用逗號分隔。
->是新引入的語法格式,代表指向動作。
大括號內的語法與傳統方法體要求基本一致。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75997.html
摘要:初體驗下面進入本文的正題表達式。接下來展示表達式和其好基友的配合。吐槽一下方法引用表面上看起來方法引用和構造器引用進一步簡化了表達式的書寫,但是個人覺得這方面沒有的下劃線語法更加通用。 感謝同事【天錦】的投稿。投稿請聯系 tengfei@ifeve.com 本文主要記錄自己學習Java8的歷程,方便大家一起探討和自己的備忘。因為本人也是剛剛開始學習Java8,所以文中肯定有錯誤和理解偏...
摘要:在支持一類函數的語言中,表達式的類型將是函數。匿名函數的返回類型與該主體表達式一致如果表達式的主體包含一條以上語句,則表達式必須包含在花括號中形成代碼塊。注意,使用表達式的方法不止一種。 摘要:此篇文章主要介紹 Java8 Lambda 表達式產生的背景和用法,以及 Lambda 表達式與匿名類的不同等。本文系 OneAPM 工程師編譯整理。 Java 是一流的面向對象語言,除了部分簡...
摘要:一表達式匿名內部類最大的問題在于其冗余的語法,比如前面的中五行代碼僅有一行是在執行任務。總結基于詞法作用域的理念,表達式不可以掩蓋任何其所在上下文的局部變量。 轉載請注明出處:https://zhuanlan.zhihu.com/p/20540175 在介紹Lambda表達式之前,我們先來看只有單個方法的Interface(通常我們稱之為回調接口): public interface...
摘要:而在中,表達式是對象,它們必須依附于一類特別的對象類型函數式接口。即表達式返回的是函數式接口類型。 Java8被稱作Java史上變化最大的一個版本。其中包含很多重要的新特性,最核心的就是增加了Lambda表達式和Stream API。這兩者也可以結合在一起使用。首先來看下什么是Lambda表達式。Lambda表達式,維基百科上的解釋是一種用于表示匿名函數和閉包的運算符,感覺看到這個解釋...
摘要:表達式又名閉包匿名函數筆記根據終于在中引入了表達式。函數式接口要介紹中表達式的實現,需要知道什么是函數式接口。但同樣需要保證外部的自由變量不能在表達式中被改變。 Java Lambda 表達式(又名閉包 (Closure)/ 匿名函數 ) 筆記 根據 JSR 335, Java 終于在 Java 8 中引入了 Lambda 表達式。也稱之為閉包或者匿名函數。 showImg(https...
閱讀 2000·2021-09-13 10:23
閱讀 2332·2021-09-02 09:47
閱讀 3792·2021-08-16 11:01
閱讀 1214·2021-07-25 21:37
閱讀 1597·2019-08-30 15:56
閱讀 521·2019-08-30 13:52
閱讀 3127·2019-08-26 10:17
閱讀 2442·2019-08-23 18:17