摘要:本文是函數(shù)式編程第二章的讀書(shū)筆記。的語(yǔ)法簡(jiǎn)化了使用匿名內(nèi)部類(lèi)時(shí)的模板代碼,讓程序員專(zhuān)注于編寫(xiě)想要執(zhí)行的行為,也讓代碼更加簡(jiǎn)潔易讀。中最重要的函數(shù)接口類(lèi)型推斷為新成員表達(dá)式提供了類(lèi)型推斷的支持,在不需要聲明參數(shù)類(lèi)型的表達(dá)式中表現(xiàn)的有為明顯。
本文是「Java 8 函數(shù)式編程」第二章的讀書(shū)筆記。
Lambda引入的變化Lambda表達(dá)式,是一種緊湊的、傳遞行為的方式,從編程思想上來(lái)講,就是代碼即數(shù)據(jù)。
過(guò)去的Java中,存在大量的匿名內(nèi)部類(lèi)的使用,會(huì)新建一個(gè)匿名內(nèi)部類(lèi)傳入調(diào)用的方法中。這種傳統(tǒng)的方式,會(huì)造成冗余的、不易閱讀的代碼。
于是Lambda誕生了。Lambda的語(yǔ)法簡(jiǎn)化了使用匿名內(nèi)部類(lèi)時(shí)的模板代碼,讓程序員專(zhuān)注于編寫(xiě)想要執(zhí)行的行為,也讓代碼更加簡(jiǎn)潔易讀。
Lambda表達(dá)式的形式Runnable runable = () -> System.out.println("Hello Lambda");//1 runable = () -> { System.out.print("Hello"); System.out.println(" Lambda"); };//2 ActionListener listener = event -> System.out.println("get event");//3 BinaryOperatoradd = (x, y) -> x + y;//4 BinaryOperator minux = (Long x, Long y) -> x - y;//5
常見(jiàn)的Lambda表達(dá)式有以上5種,每個(gè)Lambda表達(dá)式都可以分為三個(gè)部分:
參數(shù)部分:() event (x, y) (Long x, Long y)
將參數(shù)和表達(dá)式主體分開(kāi)的符號(hào):->
表達(dá)式主體
參數(shù)的形式Lambda表達(dá)式可以看作是匿名內(nèi)部類(lèi)的簡(jiǎn)寫(xiě)形式,參數(shù)也就是使用匿名內(nèi)部類(lèi)時(shí)實(shí)現(xiàn)的方法的參數(shù)。
有的方法不需要參數(shù),如Runnable的run方法,所以使用()代表參數(shù)部分。
有的方法只需要一個(gè)參數(shù)且類(lèi)型確定,如ActionListener.actionPerformed方法,可以直接使用參數(shù),不需要指定類(lèi)型,也不需要加括號(hào)。
有多個(gè)參數(shù)時(shí),必須要加上括號(hào),把參數(shù)擴(kuò)起來(lái)
當(dāng)聲明參數(shù)類(lèi)型時(shí),無(wú)論有多少個(gè)參數(shù),都需要加括號(hào)
表達(dá)式主體的形式表達(dá)式可以只有一行代碼,也可以有多行代碼;有的表達(dá)式有返回值,有的沒(méi)有。
只有一行代碼的表達(dá)式不需要{}
如果有返回值,不用寫(xiě)return,表達(dá)式會(huì)把這行代碼的返回值作為返回值
如果使用了{},則需要顯式的寫(xiě)出return
有多行代碼的表達(dá)式必須使用{}
如果有返回值,需要顯式的寫(xiě)return
引用值,而不是變量匿名內(nèi)部類(lèi)中,如果想要引用其所在方法中的變量,需要將其聲明為final。這意味著你實(shí)際引用的是一個(gè)值,而不是變量。
在Java 8 中,雖然可以引用非final的變量,但這個(gè)變量必須是既成事實(shí)上的final,如果對(duì)變量進(jìn)行修改,將無(wú)法通過(guò)編譯。這意味著Lambda表達(dá)式仍然是引用的一個(gè)值,而不是變量。
實(shí)際上可以通過(guò)使用數(shù)組來(lái)繞開(kāi)編譯器,但是這樣做之前應(yīng)該考慮一下你的代碼邏輯是否正確。
函數(shù)接口只有一個(gè)抽象方法的接口叫做函數(shù)接口。
JDK中最重要的函數(shù)接口:
Interface | Argument | Return | e.g. |
---|---|---|---|
Predicate |
T | boolean | fliter |
Consumer |
T | void | forEach |
Function |
T | R | map |
Supplier |
None | T | factory function |
UnaryOperator |
T | T | modify String |
BinaryOperator |
(T, T) | T | add two instances |
Java 8為新成員Lambda表達(dá)式提供了類(lèi)型推斷的支持,在不需要聲明參數(shù)類(lèi)型的Lambda表達(dá)式中表現(xiàn)的有為明顯。形如:
BinaryOperatoradd = (x, y) -> x + y;
的表達(dá)式得以通過(guò)編譯并正確執(zhí)行,就是因?yàn)?b>JVM通過(guò)泛型參數(shù)Integer推斷出了方法參數(shù)的類(lèi)型。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66579.html
摘要:本書(shū)第四章的讀書(shū)筆記本章主要闡述如何使用表達(dá)式基本類(lèi)型考慮到裝箱類(lèi)型過(guò)于占用內(nèi)存提供了針對(duì)基本類(lèi)型的操作以達(dá)到優(yōu)化的效果如方法對(duì)基本類(lèi)型做特殊處理的方法在命名上有明確規(guī)范如果返回類(lèi)型為基本類(lèi)型則在基本類(lèi)型名稱(chēng)前面加如果參數(shù)類(lèi)型是基本類(lèi)型則不 本書(shū)第四章的讀書(shū)筆記, 本章主要闡述: 如何使用Lambda表達(dá)式. 基本類(lèi)型 考慮到裝箱類(lèi)型過(guò)于占用內(nèi)存, JDK提供了針對(duì)基本類(lèi)型的操作, 以...
摘要:限制編寫(xiě)并行流,存在一些與非并行流不一樣的約定。底層框架并行流在底層沿用的框架,遞歸式的分解問(wèn)題,然后每段并行執(zhí)行,最終由合并結(jié)果,返回最后的值。 本書(shū)第六章的讀書(shū)筆記,也是我這個(gè)系列的最后一篇讀書(shū)筆記。后面7、8、9章分別講的測(cè)試、調(diào)試與重構(gòu)、設(shè)計(jì)和架構(gòu)的原則以及使用Lambda表達(dá)式編寫(xiě)并發(fā)程序,因?yàn)楣P記不好整理,就不寫(xiě)了,感興趣的同學(xué)自己買(mǎi)書(shū)來(lái)看吧。 并行化流操作 關(guān)于并行與并發(fā)...
摘要:但是,最好使用差異化的類(lèi)型定義,函數(shù)簽名如下其實(shí)二者說(shuō)的是同一件事。后者的返回值和初始函數(shù)的返回值相同,即。破壞式更新和函數(shù)式更新的比較三的延遲計(jì)算的設(shè)計(jì)者們?cè)趯⒁霑r(shí)采取了比較特殊的方式。四匹配模式語(yǔ)言中暫時(shí)并未提供這一特性,略。 一、無(wú)處不在的函數(shù) 一等函數(shù):能夠像普通變量一樣使用的函數(shù)稱(chēng)為一等函數(shù)(first-class function)通過(guò)::操作符,你可以創(chuàng)建一個(gè)方法引用,...
摘要:本文是函數(shù)式編程第三章的讀書(shū)筆記,章名為流。正確使用表達(dá)式明確要達(dá)成什么轉(zhuǎn)化,而不是說(shuō)明如何轉(zhuǎn)化沒(méi)有副作用只通過(guò)函數(shù)的返回值就能充分理解函數(shù)的全部作用函數(shù)不會(huì)修改程序或外界的狀態(tài)獲取值而不是變量避免使用數(shù)組逃過(guò)的追殺,應(yīng)該考慮優(yōu)化邏輯 本文是「Java 8 函數(shù)式編程」第三章的讀書(shū)筆記,章名為流。本章主要介紹了外部迭代與內(nèi)部迭代以及常用的高階函數(shù)。 外部迭代與內(nèi)部迭代 外部迭代 過(guò)去我...
摘要:利用前面所述的方法,這個(gè)例子可以用方法引用改寫(xiě)成下面的樣子構(gòu)造函數(shù)引用對(duì)于一個(gè)現(xiàn)有構(gòu)造函數(shù),你可以利用它的名稱(chēng)和關(guān)鍵字來(lái)創(chuàng)建它的一個(gè)引用。 第三章 Lambda表達(dá)式 函數(shù)式接口 函數(shù)式接口就是只定義一個(gè)抽象方法的接口,哪怕有很多默認(rèn)方法,只要接口只定義了一個(gè)抽象方法,它就仍然是一個(gè)函數(shù)式接口。 常用函數(shù)式接口 showImg(https://segmentfault.com/img...
閱讀 2356·2021-11-24 10:18
閱讀 3447·2021-09-22 15:35
閱讀 3393·2021-09-13 10:37
閱讀 3799·2021-09-06 15:14
閱讀 2102·2021-09-06 15:02
閱讀 2266·2021-09-02 15:11
閱讀 581·2019-08-30 15:53
閱讀 3106·2019-08-29 16:15