Java11 發(fā)布前抓緊掌握這些新特性
快速回顧
1.Lambda表達(dá)式: (參數(shù)) -> {主體}
Lambda表達(dá)式打開了函數(shù)式編程愛好者繼續(xù)使用Java的大門。Lambda表達(dá)式需要零個(gè)或多個(gè)參數(shù),這些參數(shù)可以在表達(dá)式主體中訪問,并隨計(jì)算結(jié)果一起返回。
Comparator<Integer> comparator = (a, b) -> a-b;
System.out.println(comparator.compare(3, 4)); // -1
2. 函數(shù)接口:只有一種方法的接口
lambda表達(dá)式本身被視為可以分配給函數(shù)接口的功能接口,如上所示。Java 8還提供了如下所示的新功能構(gòu)造:
BiFunction<Integer, Integer, Integer> comparator = (a, b) -> a-b;
System.out.println(comparator.apply(3, 4)); // -1
有關(guān)更多功能結(jié)構(gòu),請參閱java.util.function包,其擁有:Function,Supplier,Consumer,Predicate等。還可以使用下面注解來定義函數(shù)接口:
@FunctionalInterface
接口還可以具有方法的一個(gè)或多個(gè)默認(rèn)實(shí)現(xiàn),并且仍然可以保持為函數(shù)接口。它有助于避免不必要的抽象基類的默認(rèn)實(shí)現(xiàn)。
可以使用::操作符訪問靜態(tài)和實(shí)例方法,并且可以使用 ::new訪問構(gòu)造函數(shù),并且可以將它們作為函數(shù)參數(shù)傳遞,例如System.out::println .
3.流:不僅僅是迭代
流是一系列對象和操作。 接口中添加了許多默認(rèn)方法,以支持流的forEach, filter, map和reduce構(gòu)造。提供集合的Java庫現(xiàn)在支持流。 例如 BufferredReader.lines()。 所有集合都可以輕松轉(zhuǎn)換為流。 還支持并行流操作,它在內(nèi)部分配到多個(gè)CPU上的操作。
1)中間操作:懶惰性操作
對中間操作的懶惰執(zhí)行時(shí),在調(diào)用終止操作之前不會發(fā)生任何事情。
map(mapping):每個(gè)元素是一對一的,并轉(zhuǎn)換為另一種形式。
filter(predicate):給定謂詞為true的過濾元素。
peek(),limit()和sorted()是其他中間操作。
2)終止操作:結(jié)果化操作
forEach(consumer):遍歷每個(gè)元素并消費(fèi)該元素
reduce(initialValue,accumulator):它以initialValue開頭,并在每個(gè)元素上迭代,并以最終返回的值來保持值更新。
collect(collector):這是一個(gè)懶惰的評估結(jié)果,需要使用收集器收集,例如java.util.stream.Collectors,包括toList(),join(),summarizingX(),averagingX(),groupBy(), 和partitionBy()。
4. Optional:消除Null編程
基于Null的編程被認(rèn)為是糟糕的,但幾乎沒有任何選擇可以提前避免它。我們現(xiàn)在可以在Optional對象中測試isPresent(),而不是測試null。 讀取它(流也有多個(gè)構(gòu)造和操作)返回Optional對象。
5. JVM變化:PermGen已退役
PermGen已被完全刪除并被MetaSpace取代。 元空間(Metaspace)不再是堆內(nèi)存的一部分,而是分配給進(jìn)程的本機(jī)內(nèi)存的一部分。 JVM調(diào)優(yōu)現(xiàn)在需要不同的方面,因?yàn)楸O(jiān)控是必需的,不僅對于堆,而且也包括對本機(jī)內(nèi)存。
某些GC的組合已棄用。 GC根據(jù)環(huán)境配置自動分配。
還有其它的變化,包括NIO、DateTime、Security、簡潔的JDK配置文件以及jDeps,jjs,JavaScript Engine工具等。
6.Java 9:延續(xù)上一版慣例
Java 9已經(jīng)存在了一年多了,繼續(xù)保持8的傳統(tǒng)。 但它的關(guān)鍵特征模塊系統(tǒng)仍然沒有很好地被采用。 在我看來,在主流中真正采用這些功能還需要更多時(shí)間。 它以設(shè)計(jì)類的方式挑戰(zhàn)開發(fā)人員。 他們現(xiàn)在需要在應(yīng)用程序模塊方面考慮更多,而不僅僅是一組類。 無論如何,這是傳統(tǒng)開發(fā)人員通過基于微服務(wù)的開發(fā)所面臨的類似挑戰(zhàn)。 Java 9繼續(xù)添加函數(shù)式編程功能,以保持Java的活力并改進(jìn)JVM內(nèi)部。
1)Java平臺模塊系統(tǒng):小即是大
Java 9最著名的特性是Java平臺模塊系統(tǒng)(JPMS)。 這是邁向真正封裝的重要一步。 把一個(gè)大模塊打破為由密切相關(guān)的代碼和數(shù)據(jù)組成的小而清晰的模塊。 它類似于OSGi包,其中每個(gè)包定義它消耗的依賴關(guān)系并公開其他模塊所依賴的東西。
它引入了編譯和運(yùn)行時(shí)之間的裝配階段,可以構(gòu)建JDK和JRE的自定義運(yùn)行時(shí)映像。 現(xiàn)在,JDK本身由模塊組成。
~ java --list-modules java.activation@9.0.2 java.base@9.0.2 java.compiler@9.0.2 java.corba@9.0.2 ...
這些模塊稱為系統(tǒng)模塊。 沒有模塊信息的jar被加載到未命名的模塊中。 我們可以通過在文件module-info.java中提供以下信息來定義我們自己的應(yīng)用程序模塊:
requires—依賴于其他模塊
exports—導(dǎo)出模塊中包的公共API/接口
opens— 打開反射訪問包
uses— 類似requires。
要了解更多信息,請參閱快速入門指南()。
2)創(chuàng)建模塊示例
以下是IntelliJ IDE中的快速步驟:
1. 在IntelliJ創(chuàng)建模塊: 到File > New > Module - "first.module"
2. 在模塊下的src中創(chuàng)建java類(/first.module/src)
3. 編寫代碼
package com.test.modules.print;
public class Printer {
public static void print(String input){
System.out.println(input);
}
}
4. 添加module-info.java : /first.module/src > New > package

module first.module {
exports com.test.modules.print; // 導(dǎo)出包的公共apis.
}
5. 與前面相似,創(chuàng)建模塊 " main.module " 和 Main.java :
module main.module {
requires first.module;
}
Main文件代碼:
package com.test.modules.main;
import com.test.modules.print.Printer;
public class Main {
public static void main(String[] args) {
Printer.print("Hello World");
}
}
6. IntelliJ自動編譯它并記錄依賴項(xiàng)和--module-source-path
7.要運(yùn)行Main.java,它需要--module-path或-m
java -p /Workspaces/RnD/out/production/main.module:/Workspaces/RnD/out/production/first.module -m main.module/com.test.modules.main.Main Hello World Process finished with exit code 0
所以,通過這種方式,我們就可以定義模塊了。
3)其它新特性
Java 9附帶了許多其他功能。 下面列出了一些重要的部分(也是為了追趕競爭對手):
響應(yīng)式編程 - Java 9引入了響應(yīng)流,它支持React,就像發(fā)布者和消費(fèi)者之間的異步/等待通信一樣。 它在Flow類中添加了標(biāo)準(zhǔn)接口。
JShell- Java Shell - 就像任何其他腳本語言一樣,Java現(xiàn)在可以用作腳本語言。
流和集合增強(qiáng):Java 9添加了一些與"有序"和"可選"流操作相關(guān)的API。 添加of()操作以簡化創(chuàng)建集合,就像JavaScript一樣。
JVM自我調(diào)優(yōu)
G1是默認(rèn)的GC,GC中的自我調(diào)優(yōu)功能也有所改進(jìn)。CMS已被棄用。
訪問堆棧
StackWalker類被添加到對堆棧幀的延遲訪問中,我們可以遍歷并過濾到它。
多發(fā)行版JAR文件:MRJAR
一個(gè)Java程序可能包含與多個(gè)版本兼容的類。 說實(shí)話,我不確定這個(gè)功能有多么有用。
7.Java 10:更接近函數(shù)型語言
1)類型推斷
Java 10帶來了JavaScript的var。 您不僅可以自由聲明變量的類型,還可以自由的構(gòu)建集合類型。 以下內(nèi)容在Java 10中有效:
var test = "9"; test = 1.0; var set = Set.of(5, "X", 6.5, new Object());
代碼變得越來越冗長,腳本語言的魔力越來越多地被添加到Java中。 它肯定會給Java帶來這些功能的負(fù)面影響,但它給開發(fā)人員帶來了很多動力。
2)更強(qiáng)大的JVM
在并行情況下,GC完全觸發(fā)G1以提高整體性能。
堆分配可以在連接到系統(tǒng)的備用存儲設(shè)備上分配。 它將有助于確定系統(tǒng)上Java進(jìn)程的優(yōu)先級。 與重要的優(yōu)先級相比,低優(yōu)先級的存儲器可以使用慢速存儲器。
java 10還改進(jìn)了本地握手線程中的線程處理。 還增加了前期編譯(實(shí)驗(yàn)性的)。 針對循環(huán)生成增強(qiáng)的字節(jié)碼是Java 10的另一個(gè)有趣特性。
3)增強(qiáng)的語言級特性
在Java 10中,我們改進(jìn)了Optional、不可修改的集合API。
結(jié)論
我們已經(jīng)看到了從Java 8到Java 10的歷程以及Java受其他函數(shù)和腳本語言的影響。 Java是一種強(qiáng)大的面向?qū)ο缶幊陶Z言,同時(shí),它現(xiàn)在支持許多功能型結(jié)構(gòu)。 Java不僅會帶來其他語言的頂級功能,還會不斷改進(jìn)內(nèi)部功能。 它正以極快的速度發(fā)展,保持跟進(jìn)——在它逐步淘汰之前! 因?yàn)椋琂ava 11、12已在路上!
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
mybatis mybatis-plus-generator+clickhouse自動生成代碼案例詳解
這篇文章主要介紹了mybatis mybatis-plus-generator+clickhouse自動生成代碼案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Java自帶定時(shí)任務(wù)ScheduledThreadPoolExecutor實(shí)現(xiàn)定時(shí)器和延時(shí)加載功能
今天小編就為大家分享一篇關(guān)于Java自帶定時(shí)任務(wù)ScheduledThreadPoolExecutor實(shí)現(xiàn)定時(shí)器和延時(shí)加載功能,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
Maven中optional和scope元素的使用弄明白了嗎
這篇文章主要介紹了Maven中optional和scope元素的使用弄明白了嗎,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
基于spring?@Cacheable?注解的spel表達(dá)式解析執(zhí)行邏輯
這篇文章主要介紹了spring?@Cacheable?注解的spel表達(dá)式解析執(zhí)行邏輯,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java中public關(guān)鍵字用法詳細(xì)講解
這篇文章主要給大家介紹了關(guān)于Java中public關(guān)鍵字用法的相關(guān)資料,public關(guān)鍵字是和訪問權(quán)限相關(guān)的,它所修飾的方法對所有類都是可以訪問的,需要的朋友可以參考下2023-09-09
解讀Integer類的parseInt和valueOf的區(qū)別
這篇文章主要介紹了解讀Integer類的parseInt和valueOf的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

