版本任你發(fā)泵督,我用Java 8牲尺!JDK的更新,改變了哪些你寫(xiě)代碼的方式幌蚊?

作者:HollisChuang
原出處:http://www.hollischuang.com/archives/4708

前幾天谤碳,JDK 14 正式發(fā)布了,這次發(fā)布的新版本一共包含了16個(gè)新的特性溢豆。

其實(shí)蜒简,從Java8 到 Java14 ,真正的改變了程序員寫(xiě)代碼的方式的特性并不多漩仙,我們這篇文章就來(lái)看一下都有哪些搓茬。

Lambda表達(dá)式

Lambda 表達(dá)式是 Java 8 中最重要的一個(gè)新特性犹赖,Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)。

lambda 表達(dá)式的語(yǔ)法格式如下:

(parameters) -> expression
或
(parameters) ->{ statements; }

如以下例子:

// 1\. 不需要參數(shù),返回值為 5  
() -> 5  

// 2\. 接收一個(gè)參數(shù)(數(shù)字類型),返回其2倍的值  
x -> 2 * x  

// 3\. 接受2個(gè)參數(shù)(數(shù)字),并返回他們的差值  
(x, y) -> x – y  

// 4\. 接收2個(gè)int型整數(shù),返回他們的和  
(int x, int y) -> x + y  

// 5\. 接受一個(gè) string 對(duì)象,并在控制臺(tái)打印,不返回任何值(看起來(lái)像是返回void)  
(String s) -> System.out.print(s)

Lambda表達(dá)式具有簡(jiǎn)潔卷仑、容易進(jìn)行并行計(jì)算峻村、是未來(lái)的編程趨勢(shì)等優(yōu)點(diǎn),但同時(shí)也會(huì)帶來(lái)調(diào)試?yán)щy锡凝,新人理解成本高等缺點(diǎn)粘昨。

Streams API

除了Lambda 表達(dá)式外,Java 8中還引入了Stream API窜锯,這使得Java終于進(jìn)入到函數(shù)式編程的行列中來(lái)了张肾。

Stream 使用一種類似用 SQL 語(yǔ)句從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)的直觀方式來(lái)提供一種對(duì) Java 集合運(yùn)算和表達(dá)的高階抽象。

Stream API可以極大提高Java程序員的生產(chǎn)力锚扎,讓程序員寫(xiě)出高效率吞瞪、干凈、簡(jiǎn)潔的代碼驾孔。

如下圖芍秆,就是通過(guò)Stream API對(duì)集合進(jìn)行了一系列的操作:

List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis");
Stream s = strings.stream().filter(string -> string.length()<= 6).map(String::length).sorted().limit(3)
            .distinct();

而且,Stream還支持并行流翠勉,在性能上比傳統(tǒng)的for循環(huán)要好很多浪听。

從Lambda表達(dá)式和Stream API問(wèn)世至今,已經(jīng)有6年的時(shí)間了眉菱,相信很多人已經(jīng)在工作中使用過(guò)這些特性了迹栓。

雖然對(duì)于這兩種語(yǔ)法的使用,很多人持有不同的看法俭缓,但是作者還是認(rèn)為這個(gè)功能是十分好用的克伊,只是在日常寫(xiě)代碼的時(shí)候不要過(guò)分"炫技"使用超長(zhǎng)的流式操作,代碼可讀性不要太低就可以了华坦。

新的日期和時(shí)間 API

在Java 8之前愿吹,日期時(shí)間 API 存在諸多問(wèn)題,如:Date非線程安全惜姐、java.util和java.sql的包中都有日期類犁跪、日期類并不提供國(guó)際化,沒(méi)有時(shí)區(qū)支持歹袁。

所以坷衍,Java 8通過(guò)發(fā)布新的Date-Time API (JSR 310)來(lái)進(jìn)一步加強(qiáng)對(duì)日期與時(shí)間的處理。

新的java.time包涵蓋了所有處理日期条舔,時(shí)間枫耳,日期/時(shí)間,時(shí)區(qū)孟抗,時(shí)刻(instants)迁杨,過(guò)程(during)與時(shí)鐘(clock)的操作钻心。

常見(jiàn)操作如下:

// 獲取當(dāng)前的日期時(shí)間
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("當(dāng)前時(shí)間: " + currentTime);

// 時(shí)間比較
LocalDate today = LocalDate.now();
LocalDate date1 = LocalDate.of(2014, 01, 14);
if(date1.equals(today)){} 

// 時(shí)間增加
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2); // adding two hours

但是說(shuō)實(shí)話,Java8中的時(shí)間API作者日常工作中用的比較少铅协,主要是有很多歷史代碼捷沸,還是依賴Date等類型,使用新的API就要面臨互相轉(zhuǎn)換問(wèn)題狐史。

本地變量類型推斷

在Java 10之前版本中痒给,我們想定義定義局部變量時(shí)。我們需要在賦值的左側(cè)提供顯式類型预皇,并在賦值的右邊提供實(shí)現(xiàn)類型:

MyObject value = new MyObject();

在Java 10中,提供了本地變量類型推斷的功能婉刀,可以通過(guò)var聲明變量:

var value = new MyObject();

本地變量類型推斷將引入“var”關(guān)鍵字吟温,而不需要顯式的規(guī)范變量的類型。

其實(shí)突颊,所謂的本地變量類型推斷鲁豪,也是Java 10提供給開(kāi)發(fā)者的語(yǔ)法糖。雖然我們?cè)诖a中使用var進(jìn)行了定義律秃,但是對(duì)于虛擬機(jī)來(lái)說(shuō)他是不認(rèn)識(shí)這個(gè)var的爬橡,在java文件編譯成class文件的過(guò)程中,會(huì)進(jìn)行解糖棒动,使用變量真正的類型來(lái)替代var

Switch 表達(dá)式

在JDK 12中引入了Switch表達(dá)式作為預(yù)覽特性糙申。并在Java 13中修改了這個(gè)特性,引入了yield語(yǔ)句船惨,用于返回值柜裸。

而在之后的Java 14中,這一功能正式作為標(biāo)準(zhǔn)功能提供出來(lái)粱锐。

在以前疙挺,我們想要在switch中返回內(nèi)容,還是比較麻煩的怜浅,一般語(yǔ)法如下:

int i;
switch (x) {
    case "1":
        i=1;
        break;
    case "2":
        i=2;
        break;
    default:
        i = x.length();
        break;
}

在JDK13中使用以下語(yǔ)法:

int i = switch (x) {
    case "1" -> 1;
    case "2" -> 2;
    default -> {
        int len = args[1].length();
        yield len;
    }
};

或者

int i = switch (x) {
    case "1": yield 1;
    case "2": yield 2;
    default: {
        int len = args[1].length();
        yield len;
    }
};

在這之后铐然,switch中就多了一個(gè)關(guān)鍵字用于跳出switch塊了,那就是yield恶座,他用于返回一個(gè)值搀暑。和return的區(qū)別在于:return會(huì)直接跳出當(dāng)前循環(huán)或者方法,而yield只會(huì)跳出當(dāng)前switch塊跨琳。

Text Blocks

Java 13中提供了一個(gè)Text Blocks的預(yù)覽特性险掀,并且在Java 14中提供了第二個(gè)版本的預(yù)覽。

text block湾宙,文本塊樟氢,是一個(gè)多行字符串文字冈绊,它避免了對(duì)大多數(shù)轉(zhuǎn)義序列的需要,以可預(yù)測(cè)的方式自動(dòng)格式化字符串埠啃,并在需要時(shí)讓開(kāi)發(fā)人員控制格式死宣。

我們以前從外部copy一段文本串到Java中,會(huì)被自動(dòng)轉(zhuǎn)義碴开,如有一段以下字符串:

 <html>
  <body>
      <p>Hello, world</p>
  </body>
</html>

將其復(fù)制到Java的字符串中毅该,會(huì)展示成以下內(nèi)容:

"<html>\n" +
"    <body>\n" +
"        <p>Hello, world</p>\n" +
"    </body>\n" +
"</html>\n";

即被自動(dòng)進(jìn)行了轉(zhuǎn)義,這樣的字符串看起來(lái)不是很直觀潦牛,在JDK 13中眶掌,就可以使用以下語(yǔ)法了:

"""
<html>
  <body>
      <p>Hello, world</p>
  </body>
</html>
""";

使用"""作為文本塊的開(kāi)始符合結(jié)束符,在其中就可以放置多行的字符串巴碗,不需要進(jìn)行任何轉(zhuǎn)義朴爬。看起來(lái)就十分清爽了橡淆。

如常見(jiàn)的SQL語(yǔ)句:

String query = """
    SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
    WHERE `CITY` = 'INDIANAPOLIS'
    ORDER BY `EMP_ID`, `LAST_NAME`;
""";

看起來(lái)就比較直觀召噩,清爽了。

Records

Java 14 中便包含了一個(gè)新特性:EP 359: Records逸爵,

Records的目標(biāo)是擴(kuò)展Java語(yǔ)言語(yǔ)法具滴,Records為聲明類提供了一種緊湊的語(yǔ)法,用于創(chuàng)建一種類中是“字段师倔,只是字段构韵,除了字段什么都沒(méi)有”的類。通過(guò)對(duì)類做這樣的聲明趋艘,編譯器可以通過(guò)自動(dòng)創(chuàng)建所有方法并讓所有字段參與hashCode()等方法贞绳。這是JDK 14中的一個(gè)預(yù)覽特性。

使用record關(guān)鍵字可以定義一個(gè)記錄:

record Person (String firstName, String lastName) {}

record 解決了使用類作為數(shù)據(jù)包裝器的一個(gè)常見(jiàn)問(wèn)題致稀。純數(shù)據(jù)類從幾行代碼顯著地簡(jiǎn)化為一行代碼冈闭。

總結(jié)

以上,就是從Java 8 到 Java 14中抖单,新推出的可能會(huì)影響開(kāi)發(fā)人員寫(xiě)代碼的方式的一些主要特性萎攒。

不知道大家有沒(méi)有發(fā)現(xiàn),最近幾個(gè)版本中推出的一些功能矛绘,使得Java和Kotlin等語(yǔ)言越來(lái)越像了...

新的這些功能耍休,確實(shí)在一定程度上可以簡(jiǎn)化一些代碼,使得開(kāi)發(fā)過(guò)程中更加高效货矮,但是說(shuō)實(shí)話羊精,還沒(méi)有好到足夠吸引廣大開(kāi)發(fā)者拋棄Java 8進(jìn)行大規(guī)模遷移!

還是那句話:版本任你發(fā)囚玫,我用Java 8喧锦;但是新特性我們還是要去了解下的读规。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市燃少,隨后出現(xiàn)的幾起案子束亏,更是在濱河造成了極大的恐慌,老刑警劉巖阵具,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍遍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阳液,警方通過(guò)查閱死者的電腦和手機(jī)怕敬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門靠闭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柬唯,“玉大人,你說(shuō)我怎么就攤上這事封恰“耄” “怎么了越庇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵罩锐,是天一觀的道長(zhǎng)奉狈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)涩惑,這世上最難降的妖魔是什么仁期? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮竭恬,結(jié)果婚禮上跛蛋,老公的妹妹穿的比我還像新娘。我一直安慰自己痊硕,他們只是感情好赊级,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著岔绸,像睡著了一般理逊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盒揉,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天晋被,我揣著相機(jī)與錄音,去河邊找鬼刚盈。 笑死羡洛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的藕漱。 我是一名探鬼主播欲侮,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼崭闲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锈麸?” 一聲冷哼從身側(cè)響起镀脂,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忘伞,沒(méi)想到半個(gè)月后薄翅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氓奈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年翘魄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舀奶。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暑竟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出育勺,到底是詐尸還是另有隱情但荤,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布涧至,位于F島的核電站腹躁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏南蓬。R本人自食惡果不足惜纺非,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赘方。 院中可真熱鬧烧颖,春花似錦、人聲如沸窄陡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跳夭。三九已至涂圆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間优妙,已是汗流浹背乘综。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留套硼,地道東北人卡辰。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親九妈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子反砌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容