Oracle 在2017年3月底左右發(fā)布了Java新版本:Java SE9太援。Java 9 作為一個(gè)重要的發(fā)布版本為我們開發(fā)者帶來了非常多的新特性幅骄。因此劫窒,后期我會(huì)陸續(xù)發(fā)表一系列有關(guān)Java SE 9新功能的文章。今天借用這篇文章作為大綱昌执,帶著大家一起來總覽一下 Java 9 提供的新特性烛亦。
關(guān)于 Java 10 的新特性诈泼,請(qǐng)參閱Java 10 新特性深入詳解這篇文章懂拾。
Java 9 REPL (JShell)
Oracle 公司推出了一種名為jshell
的新工具 REPL (Read Evaluate Print Loop)。 我們可以稱之為 Java Shell铐达。 用它可以非常容易地執(zhí)行和測(cè)試任何Java 代碼岖赋,如類,接口瓮孙,枚舉唐断,對(duì)象,語句等杭抠。
我們可以從https://jdk9.java.net/download/下載JDK 9 EA軟件脸甘。
G:\>jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell> int a = 10
a ==> 10
jshell> System.out.println("a value = " + a )
a value = 10
如果您想進(jìn)一步了解REPL工具,請(qǐng)閱讀Java 9:REPL功能一和Java 9:REPL功能二偏灿。
Immutable Collection Factory
Oracle 引入了一系列便捷的工廠方法來創(chuàng)建不可變List
丹诀,Set
,Map
和Map.Entry
等對(duì)象翁垂。這些實(shí)用的工廠方法方便我們創(chuàng)建空或非空的Collection對(duì)象铆遭。
在Java SE 8以及更早版本中,我們可以使用諸如unmodifiableXXX之類的集合類提供的方法來創(chuàng)建Immutable Collection對(duì)象沿猜。例如枚荣,如果我們要?jiǎng)?chuàng)建一個(gè)不可變List,則可以使用Collections.unmodifiableList方法啼肩。
但是橄妆,這些Collections.unmodifiableXXX方法是一種繁瑣而冗長(zhǎng)的衙伶。為了克服這些缺點(diǎn),Oracle向List
害碾,Set
和Map
接口添加了一些實(shí)用的便捷方法痕支。
List和Set接口使用 of()
方法來創(chuàng)建一個(gè)空的或非空的不可變List或Set對(duì)象,如下所示:
空List示例
List immutableList = List.of();
非空List示例
List immutableList = List.of("one","two","three");
Map有兩組方法:of()
方法和ofEntries()
方法蛮原,分別用于創(chuàng)建Immutable Map對(duì)象和Immutable Map.Entry對(duì)象卧须。
空Map示例
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}
非空Map示例
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
如果您想了解有關(guān)這些實(shí)用方法的更多信息,請(qǐng)參閱以下文章:
Private methods in Interfaces
在Java SE 8中儒陨,我們可以在接口里使用Default和Static方法花嘶。 但是,我們不能在接口中創(chuàng)建Private方法蹦漠。
為了避免代碼冗余和提高代碼的可重用性椭员,Oracle在Java SE 9接口中引入私有方法。 從Java SE 9開始笛园,我們也可以使用private
關(guān)鍵字在接口中編寫私有方法和私有靜態(tài)方法隘击。
這些私有方法類似于其他類的私有方法,它們之間沒有區(qū)別研铆。
public interface Card{
private Long createCardID(){
// Method implementation goes here.
}
private static void displayCardDetails(){
// Method implementation goes here.
}
}
如果您想了解更多有關(guān)此新功能的信息埋同,請(qǐng)?jiān)L問以下鏈接:
Java 9:接口中的私有方法
Java 9 模塊系統(tǒng)
模塊系統(tǒng)是Java 9最大的一次變化。 Oracle公司在Jigsaw Project引入以下功能:
- 模塊化JDK
- 模塊化Java源代碼
- 模塊化運(yùn)行時(shí)映像
- 封裝Java內(nèi)部API
- Java平臺(tái)模塊系統(tǒng)
在Java SE 9版本之前棵红,我們使用Monolithic Jars開發(fā)基于Java的應(yīng)用程序凶赁。這種體系結(jié)構(gòu)有很多局限性和缺點(diǎn)。為避免所有這些缺點(diǎn)逆甜,Java SE 9引入了模塊虱肄。
JDK 9隨附92個(gè)模塊(后續(xù)版本中可能會(huì)更改)。我們可以使用JDK本身自帶的模塊交煞,也可以創(chuàng)建自己的模塊咏窿,如下所示:
module com.foo.bar { }
在這里,我們使用module
來創(chuàng)建一個(gè)簡(jiǎn)單的模塊素征。每個(gè)模塊都有一個(gè)名稱相關(guān)代碼和其他資源集嵌。
要擴(kuò)展閱讀此新特性的更多詳細(xì)信息,請(qǐng)參考下面羅列出來的3篇文章:
改進(jìn)進(jìn)程API
Java SE 9在Process API中進(jìn)行了一些改進(jìn)稚茅。他們添加了一些新的類和方法來簡(jiǎn)化OS進(jìn)程的控制和管理纸淮。
在Java SE 9 中提供了2個(gè)新的類:
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
示例代碼:
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());
改進(jìn) Try With Resource
我們知道,Java SE 7引入了一種新的異常處理結(jié)構(gòu):Try-With-Resources
以自動(dòng)管理資源亚享。
Java SE 9對(duì)該語句進(jìn)行一些改進(jìn)咽块,以避免迪馬的冗長(zhǎng)和提高可讀性。
Java 7 示例:
void testARM_Before_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (BufferedReader reader2 = reader1) {
System.out.println(reader2.readLine());
}
}
Java 9 示例:
void testARM_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
要閱讀有關(guān)此新功能的更多信息欺税,請(qǐng)瀏覽我的擴(kuò)展教程: Java 9:Try-With-Resources 的改進(jìn)
CompletableFuture API
在Java SE 9中侈沪,Oracle 改進(jìn)了CompletableFuture API以解決Java SE 8中提出的一些問題揭璃。添加一些實(shí)用的方法以支持延遲和超時(shí)操作以及如何更好的子類化。
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
這里的delayExecutor()
是一個(gè)靜態(tài)方法亭罪,用于返回新的Executor
瘦馍,該Executor
在給定的延遲后將任務(wù)提交給默認(rèn)的執(zhí)行程序。
響應(yīng)式流
如今应役,響應(yīng)式編程由于它的諸多好處在開發(fā)中變的越來越流行情组,比如:Scala,Play箩祥,Akka等等一些語言/框架都用到了Reactive Streams
院崇。 同樣,Oracle在Java SE 9中也引入了新的Reactive Streams API袍祖。
Java SE 9 Reactive Streams API是一個(gè)發(fā)布/訂閱框架底瓣,使得Java語言能夠非常輕松地實(shí)現(xiàn)異步,可伸縮和并行操作蕉陋。
Java SE 9引入了以下API捐凭,以在基于Java的應(yīng)用程序中開發(fā)響應(yīng)流。
- java.util.concurrent.Flow
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Processor
關(guān)于Reactive Streams
的更多詳細(xì)信息請(qǐng)參考我的另外一篇文章Java 9:響應(yīng)式流操作
改進(jìn) Optional 類
在Java SE 9中凳鬓,Oracle 向java.util.Optional類添加了一些有用的新方法茁肠。 在這里,我將通過一些簡(jiǎn)單的示例來討論其中一種方法:流方法
如果給定的Optional
對(duì)象中存在一個(gè)值村视,則此stream()
方將返回一個(gè)具有該值的順序Stream官套,否則它將返回一個(gè)空Stream。
如下示例展示了添加stream()
方法來延遲對(duì)可選對(duì)象:
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
這里的Optional.stream()
用于將Employee的Optional的Stream對(duì)象轉(zhuǎn)換為Employee的Stream蚁孔,以便我們可以在結(jié)果代碼中延遲處理此結(jié)果。
如果您需要通過更多示例了解Optional功能和更多關(guān)于添加到Optional類的新方法惋嚎,請(qǐng)參閱我的擴(kuò)展教程:Java 9:Optional 類的改進(jìn)
流API的改進(jìn)
在Java SE 9中杠氢,Oracle 向java.util.Stream
接口添加了四個(gè)有用的新方法。因?yàn)镾tream是接口另伍,所以所有這些新實(shí)現(xiàn)的方法都是默認(rèn)方法鼻百。其中有兩個(gè)非常重要的方法:dropWhile()
和takeWhile()
。
如果您熟悉Scala語言或任何Function編程語言摆尝,則一定會(huì)對(duì)這些方法有所了解温艇。這些是編寫某些功能代碼的非常有用的方法。讓我們?cè)谶@里討論一下takeWhile()
方法堕汞。
該takeWhile()
將謂詞(predicate
)作為參數(shù)勺爱,并返回給定Stream值的子集Stream,直到該謂詞第一次返回false為止讯检。 如果第一個(gè)值不滿足該謂詞琐鲁,則僅返回一個(gè)空Stream卫旱。
jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
.forEach(System.out::println);
1
2
3
4
要閱讀有關(guān)takeWhile()
和dropWhile()
方法以及其他新方法的更多信息,請(qǐng)我的擴(kuò)展教程:Java 9:Stream API的改進(jìn)
對(duì)@Deprecated 注解的增強(qiáng)
在Java SE 8和更早版本中围段,@Deprecated注解只是一個(gè)Marker接口顾翼,沒有任何方法。 它用于標(biāo)記Java API的類奈泪,字段适贸,方法,接口涝桅,構(gòu)造函數(shù)取逾,枚舉等。
在Java SE 9中苹支,Oracle 增強(qiáng)了@Deprecated
注解砾隅,以提供給相關(guān)已棄用的API的更多信息,并提供一種工具來分析應(yīng)用程序?qū)σ褩売玫腁PI的使用情況债蜜。 該注解為已廢棄的接口添加了兩種方法:forRemoval和since晴埂。
HTTP 2 客戶端
在Java SE 9中,Oracle 發(fā)布了新的HTTP 2 Client API寻定,以支持HTTP / 2協(xié)議和WebSocket功能儒洛。 由于現(xiàn)有的或舊式的HTTP客戶端API存在許多問題(例如只支持HTTP / 1.1協(xié)議,并不支持HTTP / 2協(xié)議和WebSocket狼速,僅在阻塞模式下工作琅锻,并且存在很多性能問題。)向胡,Oracle將HttpURLConnection
API替換為新的HTTP Client恼蓬。
Oracle在java.net.http
包下引入一個(gè)新的HTTP 2客戶端API。 它同時(shí)支持HTTP / 1.1和HTTP / 2協(xié)議僵芹。 同時(shí)支持同步(阻止模式)和異步模式处硬。 而且使用WebSocket API來支持異步模式。
我們可以在https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html上看到新的API拇派。
HTTP 2 Client 示例
jshell> import java.net.http.*
jshell> import static java.net.http.HttpRequest.*
jshell> import static java.net.http.HttpResponse.*
jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html
jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d
jshell> System.out.println("Response was " + response.body(asString()))
請(qǐng)參閱我的擴(kuò)展教程:Java SE 9:HTTP 2 Client荷辕,以了解HTTP / 2協(xié)議和WebSocket,新API的優(yōu)點(diǎn)以及老 API的缺點(diǎn)件豌,并提供了一些有用的示例疮方。
多分辨率圖像API
在Java SE 9中,Oracle 引入了一個(gè)新的Multi-Resolution Image API茧彤。 此API中的重要接口是MultiResolutionImage
骡显。 你可以在java.awt.image
包中看到它。
MultiResolutionImage
封裝了一組具有不同高度和寬度(即不同分辨率)的圖像,并允許我們根據(jù)需求查詢它們蟆盐。
其它的一些Java 9 特性
在該部分中承边,我只是列出一些Java SE 9的其他新功能。 這并不是說這些功能不是那么重要石挂。 通過一些有用的示例博助,它們對(duì)于理解它們也非常重要和有用。
截至目前痹愚,我還沒有足夠的時(shí)間來擴(kuò)展講解這些特性富岳。 后續(xù)我將逐一介紹這些功能,并通過簡(jiǎn)短的討論和示例將其添加到上面部分中拯腮。 后期再單獨(dú)詳細(xì)寫各自的功能窖式。
- GC (Garbage Collector) Improvements
- Stack-Walking API
- Filter Incoming Serialization Data
- Deprecate the Applet API
- Indify String Concatenation
- Enhanced Method Handles
- Java Platform Logging API and Service
- Compact Strings
- Parser API for Nashorn
- Javadoc Search
- HTML5 Javadoc
后續(xù)我將逐一介紹這些Java 9的功能,并用更多的描述和示例來更新它們动壤。
即以此文獻(xiàn)給那些Java愛好者們萝喘,歡迎大家圍觀。
原文鏈接:https://www.journaldev.com/13121/java-9-features-with-examples