最近有一段時間沒寫博客了,這幾天回到學校,才閒下來,決定寫一寫最近學習到的知識,既是爲了分享,也是爲了鞏固。以前看到過一篇調查,調查說的是學習新知識,光只是看的話,知識的獲取率只有5%,依次日後是實踐,練習,觸類旁通等,最後一步就是能將知識教授給別人,最後一步的知識獲取率可以達到95%,雖說數據不必定準確,可是趨勢是應該是沒差的。
寫博客,就是屬於教授知識的別人的一種方式,雖然博客或許不會有其餘人來看,可是至少他有一個用戶,就是本身,我發現我前面博客的一些毛病,就是寫的太簡單,沒有條理,沒有邏輯,連我本身看了有時候都不知道其因此然,所以這種博客寫出來是沒有意義的,不管是對本身,仍是對他人,做用都是十分小的,也達不到分享的做用,更不用談提升,鞏固本身的水平了。
從這篇博客開始,我決定開始注重博客的質量,固然質量這個東西,仁者見仁,智者見智,我認爲的質量就是可以把你想表達的東西表達清楚,讓一個不懂這個知識的人,能開始入門瞭解,若是是進階類的文章,則可讓有必定基礎的人,至少從中收穫一點點東西,哪怕是一行代碼,一個公式,一種思考的方法,都是有質量的。因此醒醒吧,天底下沒有那麼多聰明人,也不須要那麼多聰明人,聰明人有時候並不被社會,被人們所容納,由於他們與他人脫離開來了,成天談論看似高深的技術,你真的就聰明瞭嗎?人們更喜歡可愛的愚人,而愚人教授的知識,更能讓他人接受,因此作一個愚人是個人目標:)。
感慨完了,那就開始吧,每一個知識系列的每一章,內容可能不是不少,也不算高深,但我力求能讓人理解,也讓本身理解,畢竟我也是還沒畢業的菜鳥,在編程這一行只能算是LEVEL 1 吧:)。所以本系列博客,是基於我看的衆多介紹JDK8的博客與社區(例如javarevisited)以及書籍的一些我的整理與思考,本系列不少思路來自於Richard Warburton的《Java8 函數式編程》。html
本系列博客,介紹的是JDK8 的函數式編程,那麼第一個問題就出現了,爲何要出現JDK8?
JAVA不是已經很好,很強大了嗎,不少公司用的仍是1.6,1.7呀,1.8有必要嗎?更不要提即將問世的JDK9了,魯迅的《拿來主義》說過這麼一句話java
去其糟粕,取其精華程序員
JAVA若是真的這麼天衣無縫,那爲何還會有其餘語言的興盛呢?因此說,沒有同樣東西是絕對完美的,JDK8包括以後的版本,就是不斷的完善JAVA語言,讓它往更好的方向上去走,面向過程有它的缺點,然而無疑也有它的優勢,在JAVA8 以前,JAVA欠缺了高效的並行操做,寫一個並行程序代碼每每是費事費力又不討好,然而在JAVA8之上,只須要簡單的修改幾行代碼,就可讓代碼在多核CPU上完美運行,因此爲了達到這個效果,編寫這樣的JDK類庫,就須要在語言層次上修改現有的JAVA,所以,在JAVA中增長Lambda表達式就是刻不容緩的任務了--事實上在2011年的JDK7版本中預計就要引入Lambda,可是由於種種緣由,計劃最終推遲到了2014年的JDK8。
爲了達到高效操做集合類,實現並行計算或者操做的目的,你得要學習來自JDK8的新的語法,而且要從面相對象編程的侷限中稍微跳出來一些,可是比起以前手寫一大段代碼,我以爲這樣的學習是十分值得也是十分必要的,節省了時間與成本,同時也更不容易出錯!站在巨人的肩膀上,這是任何一我的都須要借鑑的方法,爲何每次JDK版本的變動都歷時幾年?oracle的工程師並非傻瓜,尤爲是在編寫JDK類庫上,借用他人的代碼並非可恥的行爲,新的代碼更加高效,而且更讓人容易閱讀,這種新代碼更加關注的它所實現的業務邏輯,而並不是實現機制,因此你看即便是引入了Lambda,從某種意義上來講,這依舊是面向對象的一種實現方法--關注的並不是實現機制,這樣的代碼更容易維護,也更不容易出錯。express
函數式編程,這個詞語由兩個名詞構成,函數,編程。編程這個詞我就不用解釋了,你們都是作這個的。函數,其實單獨抽離出來這個詞語,也並不陌生,函數是什麼?初中數學就開始學函數了,固然這裏又引伸出一個話題,數學與編程語言的關係,這個話題之後有時間再聊(固然頗有可能之後忘記了 :-D)。
\(F(x)=x+1\)
這就是一個函數呀,因此儘管每一個人對函數式編程的理解各不相同,但核心思想都是基於函數上的,也就是說:使用一個不可變的值與函數,對參數進行處理,從而映射成另一個值。如上圖的F(x)=x+1,你將1放進去,f(1)永遠是等於2,1->f(1),將1映射成了f(1),而f(1)永遠是等於2的。
固然函數式編程若是扯開來,要說不少,我這裏只是做一個簡單的介紹,本系列博客的目的也不是和你們談什麼叫函數,個人目的是如何寫高效,易於閱讀維護的代碼,以及如何更好的利用JDK8的新特性。編程
開始使用Java 8時,首先作的就是使用lambda表達式替換匿名類,而實現Runnable接口是匿名類的最好示例。看一下Java 8以前的runnable實現方法,須要4行代碼,而使用lambda表達式只須要一行代碼。咱們在這裏作了什麼呢?那就是用() -> {}代碼塊替代了整個匿名類。oracle
// 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寫出以下代碼:ide
(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}
本篇簡單的介紹了java8爲何要引入lambda以及程序猿們爲何要學習這樣的語法,而且以一個Runnable接口爲例子介紹了一下lambda的語法。
下一篇將介紹java8中新增的類庫stream流的相關操做,這將大大簡化java程序員們對於集合的操做。
談一談Java8的函數式編程(二) --Java8中的流