Java8函數(shù)式編程-包教包會(huì)系列(一)

作者:曹偉,叩丁狼高級(jí)講師。原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。

1-Java8新特性簡(jiǎn)介&為什么要學(xué)習(xí)Java8

前言

Oracle 公司于 2014 年 3 月 18 日發(fā)布 Java 8 ,距離現(xiàn)在已經(jīng)有很長(zhǎng)一段時(shí)間了,Java10也在2018年 3月 21日正式發(fā)布,并且Oracle宣布Java 語(yǔ)言將每隔 6 個(gè)月提供一次更新。Java語(yǔ)言不斷更新迭代,然而很多Java程序員缺沒(méi)有跟上技術(shù)更新的步伐!所以寫(xiě)下這篇系列文章,希望可以幫助大家入門(mén)Java8!
話不多說(shuō),開(kāi)始發(fā)車(chē)!

寶刀未老的Java

1995年Sun公司推出的Java語(yǔ)言,從第一個(gè)版本誕生到現(xiàn)在已經(jīng)有二十多年的了。時(shí)間若白駒過(guò)隙,轉(zhuǎn)瞬即逝。二十多年來(lái)IT技術(shù)更新?lián)Q代,編程語(yǔ)言層出不窮。就像自然界遵循優(yōu)勝劣汰的法則,編程語(yǔ)言也是一樣,很多老牌的編程語(yǔ)言被新興的編程語(yǔ)言替代,逐漸沒(méi)落甚至退出歷史舞臺(tái),然而Java作為一門(mén)有著二十多年歷史的編程語(yǔ)言卻越發(fā)顯得生機(jī)勃勃!寶刀未老!究其原因,其中很重要的一點(diǎn)就是Java語(yǔ)言不斷進(jìn)行版本迭代推出一系列符合技術(shù)發(fā)展趨勢(shì)的新特性!

“從Java的演變路徑來(lái)看,它一直致力于讓并發(fā)編程更容易、出錯(cuò)更少。Java 1.0里有線程和鎖,甚至有一個(gè)內(nèi)存模型——這是當(dāng)時(shí)的最佳做法。Java 5更是添加了工業(yè)級(jí)的構(gòu)建模塊,如線程池和并發(fā)集合。Java 7添加了分支/合并(fork/join)框架,使得并行變得更實(shí)用。而Java 8對(duì)并行又有了一個(gè)更簡(jiǎn)單的新思路!”

-摘自《Java 8 In Action》

Java8核心新特性簡(jiǎn)介

Java 8可謂是自Java 5以來(lái)最具革命性的版本了,她在語(yǔ)言、編譯器、類(lèi)庫(kù)、開(kāi)發(fā)工具以及Java虛擬機(jī)等方面都帶來(lái)了不少新特性,其中最為核心的為L(zhǎng)ambda 表達(dá)式與Stream API (其他新特性見(jiàn)文末附錄)

★ Lambda表達(dá)式

Lambda表達(dá)式可以說(shuō)是Java 8最大的賣(mài)點(diǎn),她將函數(shù)式編程引入了Java。Lambda允許把函數(shù)作為一個(gè)方法的參數(shù),或者把代碼看成數(shù)據(jù)。

★ Stream API

Stream API是把真正的函數(shù)式編程風(fēng)格引入到Java中。其實(shí)簡(jiǎn)單來(lái)說(shuō)可以把Stream理解為MapReduce。從語(yǔ)法上看,也很像linux的管道、或者鏈?zhǔn)骄幊蹋a寫(xiě)起來(lái)簡(jiǎn)潔明了,非??釒?!

為什么要學(xué)習(xí)Java8函數(shù)式編程

通過(guò)Java8的文檔我們可以看到Java8添加了很多API用于對(duì)函數(shù)式編程的支持,可以看出Java8對(duì)函數(shù)式編程的重視程度。
文檔地址:
https://docs.oracle.com/javase/8/docs/api/

Java8之所以費(fèi)這么大功夫引入函數(shù)式編程,原因有二:

1.代碼簡(jiǎn)潔,函數(shù)式編程寫(xiě)出的代碼簡(jiǎn)潔且意圖明確,比如使用stream接口讓你告別for循環(huán)。

2.多核友好,Java函數(shù)式編程使得編寫(xiě)并行程序如此簡(jiǎn)單,只需要調(diào)用一下parallel()方法即可。

“對(duì)于習(xí)慣了面向?qū)ο缶幊痰拈_(kāi)發(fā)者來(lái)說(shuō),抽象的概念并不陌生。面向?qū)ο缶幊淌菍?duì)數(shù)據(jù)進(jìn)行抽象,而函數(shù)式編程是對(duì)行為進(jìn)行抽象?,F(xiàn)實(shí)世界中,數(shù)據(jù)和行為并存,程序也是如此,因此這兩種編程方式我們都得學(xué)。

函數(shù)式編程這種新的抽象方式還有其他好處,例如:

不是所有人都在編寫(xiě)性能優(yōu)先的代碼,對(duì)于這些人來(lái)說(shuō),函數(shù)式編程帶來(lái)的好處尤為明顯。程序員能編寫(xiě)出更容易閱讀的代碼——這種代碼更多地表達(dá)了業(yè)務(wù)邏輯的意圖,而不是它的實(shí)現(xiàn)機(jī)制。易讀的代碼也易于維護(hù)、更可靠、更不容易出錯(cuò)。比如,在寫(xiě)回調(diào)函數(shù)和事件處理程序時(shí),程序員不必再糾纏于匿名內(nèi)部類(lèi)的冗繁和可讀性,函數(shù)式編程讓事件處理系統(tǒng)變得更加簡(jiǎn)單。能將函數(shù)方便地傳遞也讓編寫(xiě)惰性代碼變得容易,惰性代碼在真正需要時(shí)才初始化變量的值。

總而言之,Java 已經(jīng)不是祖輩們當(dāng)年使用的Java 了,嗯, 這不是件壞事?!?/p>

-摘自《Java8 Lambdas Exercises》

附錄:Java8其他新特性

● 接口的默認(rèn)方法與靜態(tài)方法

我們可以在接口中定義默認(rèn)方法,使用default關(guān)鍵字,并提供默認(rèn)的實(shí)現(xiàn)。所有實(shí)現(xiàn)這個(gè)接口的類(lèi)都會(huì)接受默認(rèn)方法的實(shí)現(xiàn),除非子類(lèi)提供的自己的實(shí)現(xiàn)。

● 方法引用

通常與Lambda表達(dá)式聯(lián)合使用,可以直接引用已有Java類(lèi)或?qū)ο蟮姆椒ā?/p>

● 重復(fù)注解

Java 8引入重復(fù)注解,相同的注解在同一地方也可以聲明多次。

● 擴(kuò)展注解的支持

Java 8擴(kuò)展了注解的上下文,幾乎可以為任何東西添加注解,包括局部變量、泛型類(lèi)、父類(lèi)與接口的實(shí)現(xiàn),連方法的異常也能添加注解。

● Optional

Java 8引入Optional類(lèi)來(lái)防止空指針異常,使用Optional類(lèi)我們就不用顯式進(jìn)行空指針檢查了。

● Date/Time API (JSR 310)

Java 8新的Date-Time API (JSR 310)受Joda-Time的影響,提供了新的java.time包,可以用來(lái)替代 java.util.Date和java.util.Calendar。

● JavaScript引擎Nashorn

Nashorn允許在JVM上開(kāi)發(fā)運(yùn)行JavaScript應(yīng)用,允許Java與JavaScript相互調(diào)用。

● Base64

在Java 8中,Base64編碼成為了Java類(lèi)庫(kù)的標(biāo)準(zhǔn)。Base64類(lèi)同時(shí)還提供了對(duì)URL、MIME友好的編碼器與解碼器。

● 更好的類(lèi)型推測(cè)機(jī)制

Java 8在類(lèi)型推測(cè)方面有了很大的提高,這就使代碼更整潔,不需要太多的強(qiáng)制類(lèi)型轉(zhuǎn)換了。

● 編譯器優(yōu)化

Java 8將方法的參數(shù)名加入了字節(jié)碼中,這樣在運(yùn)行時(shí)通過(guò)反射就能獲取到參數(shù)名,只需要在編譯時(shí)使用-parameters參數(shù)。

● 并行(parallel)數(shù)組

支持對(duì)數(shù)組進(jìn)行并行處理,主要是parallelSort()方法,它可以在多核機(jī)器上極大提高數(shù)組排序的速度。

● 并發(fā)(Concurrency)

在新增Stream機(jī)制與Lambda的基礎(chǔ)之上,加入了一些新方法來(lái)支持聚集操作。

● Nashorn引擎jjs

基于Nashorn引擎的命令行工具。它接受一些JavaScript源代碼為參數(shù),并且執(zhí)行這些源代碼。

● 類(lèi)依賴分析器jdeps

可以顯示Java類(lèi)的包級(jí)別或類(lèi)級(jí)別的依賴。

● JVM的PermGen空間被移除

取代它的是Metaspace(JEP 122)。

Java 8是一次變化巨大的更新,借鑒了很多其它語(yǔ)言和類(lèi)庫(kù)的優(yōu)秀之處,讓Java變得更簡(jiǎn)單、更高效、更強(qiáng)大!

WechatIMG7.jpeg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java 8自Java 5(發(fā)行于2004)以來(lái)最具革命性的版本。Java 8 為Java語(yǔ)言、編譯器、類(lèi)庫(kù)、開(kāi)發(fā)...
    huoyl0410閱讀 721評(píng)論 1 2
  • Java 8 函數(shù)式編程 本次主題主要介紹什么是函數(shù)式編程,其主要特點(diǎn), 以及它在 Java8 中是怎么體現(xiàn)的.函...
    captainary閱讀 2,415評(píng)論 1 11
  • 夏季來(lái)臨,不少市民會(huì)患上各種急性腹瀉,尤其是抵抗力較差的孩子更容易中招。記者了解到,炎熱的天氣,易使細(xì)菌、病毒大量...
    積安堂蜂蜜閱讀 675評(píng)論 0 0
  • 前幾天看到一句話:決定你成功的,不是你的夢(mèng)想,而是你的行動(dòng)。乍一看,有些詫異,因?yàn)槠綍r(shí)一再?gòu)?qiáng)調(diào)夢(mèng)想的作用,回味一...
    愛(ài)家美少女閱讀 392評(píng)論 0 1
  • Homebrew進(jìn)行安裝Node.js brew install node 設(shè)置鏡像 npm config set...
    西涼0閱讀 804評(píng)論 0 0

友情鏈接更多精彩內(nèi)容