淺析Java8的函數(shù)式編程
前言
本系列博客,介紹的是JDK8 的函數(shù)式編程,那么第一個問題就出現(xiàn)了,為什么要出現(xiàn)JDK8?
JAVA如果真的這么完美無缺,那為什么還會有其他語言的興盛呢?所以說,沒有一樣?xùn)|西是絕對完美的,JDK8包括之后的版本,就是不斷的完善JAVA語言,讓它往更好的方向上去走,面向過程有它的缺點,然而無疑也有它的優(yōu)點,在JAVA8 之前,JAVA欠缺了高效的并行操作,寫一個并行程序代碼往往是費事費力又不討好,然而在JAVA8之上,只需要簡單的修改幾行代碼,就可以讓代碼在多核CPU上完美運行,所以為了達到這個效果,編寫這樣的JDK類庫,就需要在語言層次上修改現(xiàn)有的JAVA,因此,在JAVA中增加Lambda表達式就是刻不容緩的任務(wù)了--事實上在2011年的JDK7版本中預(yù)計就要引入Lambda,但是因為種種原因,計劃最終推遲到了2014年的JDK8。
為了達到高效操作集合類,實現(xiàn)并行計算或者操作的目的,你得要學(xué)習(xí)來自JDK8的新的語法,并且要從面相對象編程的局限中稍微跳出來一些,但是比起之前手寫一大段代碼,我覺得這樣的學(xué)習(xí)是十分值得也是十分必要的,節(jié)省了時間與成本,同時也更不容易出錯!站在巨人的肩膀上,這是任何一個人都需要借鑒的方法,為什么每次JDK版本的變更都?xì)v時幾年?oracle的工程師并不是傻瓜,尤其是在編寫JDK類庫上,借用他人的代碼并不是可恥的行為,新的代碼更加高效,并且更讓人容易閱讀,這種新代碼更加關(guān)注的它所實現(xiàn)的業(yè)務(wù)邏輯,而并非實現(xiàn)機制,所以你看即使是引入了Lambda,從某種意義上來說,這依舊是面向?qū)ο蟮囊环N實現(xiàn)方法--關(guān)注的并非實現(xiàn)機制,這樣的代碼更容易維護,也更不容易出錯。
什么是函數(shù)式編程
函數(shù)式編程,這個詞語由兩個名詞構(gòu)成,函數(shù),編程。編程這個詞我就不用解釋了,大家都是做這個的。函數(shù),其實單獨抽離出來這個詞語,也并不陌生,函數(shù)是什么?初中數(shù)學(xué)就開始學(xué)函數(shù)了,當(dāng)然這里又引申出一個話題,數(shù)學(xué)與編程語言的關(guān)系,這個話題以后有時間再聊(當(dāng)然很有可能以后忘記了 :-D)。
F(x)=x+1F(x)=x+1
這就是一個函數(shù)呀,所以盡管每個人對函數(shù)式編程的理解各不相同,但核心思想都是基于函數(shù)上的,也就是說:使用一個不可變的值與函數(shù),對參數(shù)進行處理,從而映射成另外一個值。如上圖的F(x)=x+1,你將1放進去,f(1)永遠是等于2,1->f(1),將1映射成了f(1),而f(1)永遠是等于2的。
當(dāng)然函數(shù)式編程如果扯開來,要說很多,我這里只是作一個簡單的介紹,本系列博客的目的也不是和大家談什么叫函數(shù),我的目的是如何寫高效,易于閱讀維護的代碼,以及如何更好的利用JDK8的新特性。
Your first Lambda expression
開始使用Java 8時,首先做的就是使用lambda表達式替換匿名類,而實現(xiàn)Runnable接口是匿名類的最好示例??匆幌翵ava 8之前的runnable實現(xiàn)方法,需要4行代碼,而使用lambda表達式只需要一行代碼。我們在這里做了什么呢?那就是用() -> {}代碼塊替代了整個匿名類。
// Java 8之前:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Before Java8, too much code for too little to do");
}
}).start();
//Java 8方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();輸出:
too much code, for too little to do
Lambda expression rocks !!
這個例子向我們展示了Java 8 lambda表達式的語法。你可以使用lambda寫出如下代碼:
(params) -> expression
(params) -> statement
(params) -> { statements }例如,如果你的方法不對參數(shù)進行修改、重寫,只是在控制臺打印點東西的話,那么可以這樣寫:
() -> System.out.println("Hello Lambda Expressions");如果你的方法接收兩個參數(shù),那么可以寫成如下這樣:
(int even, int odd) -> even + odd
順便提一句,通常都會把lambda表達式內(nèi)部變量的名字起得短一些。這樣能使代碼更簡短,放在同一行。所以,在上述代碼中,變量名選用a、b或者x、y會比even、odd要好。
因此總結(jié)一下的格式是
params=參數(shù),your Code=你的代碼,results=返回值
(params,params) -> {your Code}如果只有一個參數(shù)或者一行代碼的話 可以將括號省略掉,于是就變成了
params -> your Code
如果是有返回值是的話是
(params) -> {return results}同樣,這種return只有一行的話,也可以簡寫,例如
x -> x+1
這就等效于
(x) -> {return x+1}以上所述是小編給大家介紹的Java8的函數(shù)式編程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java8中關(guān)于Function.identity()的使用
這篇文章主要介紹了Java8中關(guān)于Function.identity()的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
使用Feign擴展包實現(xiàn)微服務(wù)間文件上傳
這篇文章主要為大家詳細(xì)介紹了使用Feign擴展包實現(xiàn)微服務(wù)間文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
springboot代碼,注解配置獲取yml,properties文件的map即鍵值對
這篇文章主要介紹了springboot代碼,注解配置獲取yml,properties文件的map即鍵值對,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
利用Jackson解析JSON的詳細(xì)實現(xiàn)教程
JSON對于開發(fā)者并不陌生,如今的WEB服務(wù)等都是以JSON作為數(shù)據(jù)交換的格式。學(xué)習(xí)JSON格式的操作工具對開發(fā)者來說是必不可少的。本文將介紹如何使用Jackson開源工具庫對JSON進行常見操作,需要的可以參考一下2022-07-07
使用@PathVariable時候無法將參數(shù)映射到變量中的解決
這篇文章主要介紹了使用@PathVariable時候無法將參數(shù)映射到變量中的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
在Android系統(tǒng)中使用WebViewClient處理跳轉(zhuǎn)URL的方法
這篇文章主要介紹了在Android系統(tǒng)中使用WebViewClient處理跳轉(zhuǎn)URL的方法,實現(xiàn)代碼為Java語言編寫,是需要的朋友可以參考下2015-07-07

