系列之前我想說的

??最近有一段時間沒寫博客了,這幾天回到學校,才閑下來,決定寫一寫最近學習到的只是,既是為了分享,也是為了鞏固。之前看到過一篇調查,文章的數據是學習新知識,光是看只能獲得大約5%,然后依次往后是實踐,練習,舉一反三等,最后一步呢,就是能夠教授給別人,最后一步的知識獲取率能夠達到95%,雖然說數據不一定準確,但是趨勢是應該是沒差的。
??寫博客,就是屬于教授知識的別人的一種方式,雖然博客或許不會有其他人來看,但是至少他有一個用戶,就是自己,我發(fā)現我前面博客的一些毛病,就是寫的太簡單,沒有條理,沒有邏輯,連我自己看了有時候都不知道其所以然,因此這種博客寫出來是沒有意義的,無論是對自己,還是對他人,作用都是十分小的,也達不到分享的作用,更不用談提高,鞏固自己的水平了。
??從這篇博客開始,我決定開始注重博客的質量,當然質量這個東西,仁者見仁,智者見智,我認為的質量就是能夠把你想表達的東西表達清楚,讓一個不懂這個知識的人,能開始入門了解,如果是進階類的文章,則可以讓有一定基礎的人,至少從中收獲一點點東西,哪怕是一行代碼,一個公式,一種思考的方法,都是有質量的。所以醒醒吧,天底下沒有那么多聰明人,也不需要那么多聰明人,聰明人有時候并不被社會,被人們所容納,因為他們與他人脫離開來了,整天談論看似高深的技術,你真的就聰明了嗎?人們更喜歡可愛的愚人,而愚人教授的知識,更能讓他人接受,所以做一個愚人是我的目標:)。
?? 感慨完了,那就開始吧,每個知識系列的每一章,內容可能不是很多,也不算高深,但我力求能讓人理解,也讓自己理解,畢竟我也是還沒畢業(yè)的菜鳥,在編程這一行只能算是LEVEL 1 吧:)。因此本系列博客,是基于我看的眾多介紹JDK8的博客與社區(qū)(例如javarevisited)以及書籍的一些個人整理與思考,本系列很多思路來自與Richard Warburton《Java8 函數式編程》。

前言

??本系列博客,介紹的是JDK8 的函數式編程,那么第一個問題就出現了,為什么要出現JDK8?
??JAVA不是已經很好,很強大了嗎,很多公司用的還是1.6,1.7呀,1.8有必要嗎?更不要提即將問世的JDK9了,魯迅的《拿來主義》說過這么一句話

去其糟粕,取其精華

??JAVA如果真的這么完美無缺,那為什么還會有其他語言的興盛呢?所以說,沒有一樣東西是絕對完美的,JDK8包括之后的版本,就是不斷的完善JAVA語言,讓它往更好的方向上去走,面向過程有它的缺點,然而無疑也有它的優(yōu)點,在JAVA8 之前,JAVA欠缺了高效的并行操作,寫一個并行程序代碼往往是費事費力又不討好,然而在JAVA8之上,只需要簡單的修改幾行代碼,就可以讓代碼在多核CPU上完美運行,所以為了達到這個效果,編寫這樣的JDK類庫,就需要在語言層次上修改現有的JAVA,因此,在JAVA中增加Lambda表達式就是刻不容緩的任務了--事實上在2011年的JDK7版本中預計就要引入Lambda,但是因為種種原因,計劃最終推遲到了2014年的JDK8。
??為了達到高效操作集合類,實現并行計算或者操作的目的,你得要學習來自JDK8的新的語法,并且要從面相對象編程的局限中稍微跳出來一些,但是比起之前手寫一大段代碼,我覺得這樣的學習是十分值得也是十分必要的,節(jié)省了時間與成本,同時也更不容易出錯!站在巨人的肩膀上,這是任何一個人都需要借鑒的方法,為什么每次JDK版本的變更都歷時幾年?oracle的工程師并不是傻瓜,尤其是在編寫JDK類庫上,借用他人的代碼并不是可恥的行為,新的代碼更加高效,并且更讓人容易閱讀,這種新代碼更加關注的它所實現的業(yè)務邏輯,而并非實現機制,所以你看即使是引入了Lambda,從某種意義上來說,這依舊是面向對象的一種實現方法--關注的并非實現機制,這樣的代碼更容易維護,也更不容易出錯。

什么是函數式編程

??函數式編程,這個詞語由兩個名詞構成,函數,編程。編程這個詞我就不用解釋了,大家都是做這個的。函數,其實單獨抽離出來這個詞語,也并不陌生,函數是什么?初中數學就開始學函數了,當然這里又引申出一個話題,數學與編程語言的關系,這個話題以后有時間再聊(當然很有可能以后忘記了 :-D)。
??????????????????????F(x)=x+1F(x)=x+1
?? 這就是一個函數呀,所以盡管每個人對函數式編程的理解各不相同,但核心思想都是基于函數上的,也就是說:使用一個不可變的值與函數,對參數進行處理,從而映射成另外一個值。如上圖的F(x)=x+1,你將1放進去,f(1)永遠是等于2,1->f(1),將1映射成了f(1),而f(1)永遠是等于2的。
?? 當然函數式編程如果扯開來,要說很多,我這里只是作一個簡單的介紹,本系列博客的目的也不是和大家談什么叫函數,我的目的是如何寫高效,易于閱讀維護的代碼,以及如何更好的利用JDK8的新特性。

Your first Lambda expression

??開始使用Java 8時,首先做的就是使用lambda表達式替換匿名類,而實現Runnable接口是匿名類的最好示例。看一下Java 8之前的runnable實現方法,需要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 doLambda expression rocks !!

這個例子向我們展示了Java 8 lambda表達式的語法。你可以使用lambda寫出如下代碼:

(params) -> expression
(params) -> statement
(params) -> { statements }

例如,如果你的方法不對參數進行修改、重寫,只是在控制臺打印點東西的話,那么可以這樣寫:

() -> System.out.println("Hello Lambda Expressions");

如果你的方法接收兩個參數,那么可以寫成如下這樣:

(int even, int odd) -> even + odd

順便提一句,通常都會把lambda表達式內部變量的名字起得短一些。這樣能使代碼更簡短,放在同一行。所以,在上述代碼中,變量名選用a、b或者x、y會比even、odd要好。

因此總結一下的格式是

params=參數,your Code=你的代碼,results=返回值

(params,params) -> {your Code}

如果只有一個參數或者一行代碼的話 可以將括號省略掉,于是就變成了

params -> your Code

如果是有返回值是的話是

(params) -> {return results}

同樣,這種return只有一行的話,也可以簡寫,例如

x -> x+1

這就等效于

(x) -> {return x+1}



如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!歡迎各位轉載,但是未經作者本人同意,轉載文章之后必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責任的權利。

http://www.cnblogs.com/invoker-/p/6893688.html