Java 9已經發佈了有一段時間了,現在讓我們來看看Java 9中的功能特性,看看它帶給我們的哪些重大變化。
一些重要的Java 9特性是如下所示 -
Oracle公司將在2017年3月底前發布Java SE 9。在本文中,將通過一些範例簡要討論「Java 9功能」。
Oracle公司推出了一種名為「jshell」的新工具。 它代表Java Shell,也稱為REPL(Read Evaluate Print Loop)。 它用於非常容易地執行和測試任何Java結構,如類,介面,列舉,物件,語句等。
執行效果如下所示 -
Oracle Corp引入了一些便利的工廠方法來建立Immutable List
,Set
,Map
和Map.Entry
物件。 這些實用程式方法用於建立空的或非空的集合物件。
在Java SE 8和更早的版本中,我們可以使用不可修改的Collections
類實用程式方法來建立Immutable Collection
物件。 例如,如果想建立一個不可變列表,那麼可以使用Collections.unmodifiableList
方法。
然而這些Collections.unmodifiableXXX
方法是非常繁瑣和冗長的方法。為了克服這些缺點,Oracle公司在List,Set和Map介面中增加了一些實用方法。
List和Set介面具有of()
方法來建立一個空的或不空的不可變列表或Set
物件,如下所示:
空列表範例
List immutableList = List.of();
非空列表範例
List immutableList = List.of("one","two","three");
Map有兩套方法:分別建立Immutable Map
物件和Immutable Map.Entry
物件的of()
方法和Entries()
方法。
空Map範例
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}
非空對映範例
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
在Java 8中,可以使用Default
和Static
方法在介面中提供方法實現。 但是不能在介面中建立私有方法。
為了避免冗餘程式碼和更多的重用性,Oracle公司將在Java SE 9介面中引入私有方法。 從Java SE 9開始,我們可以使用'private'
關鍵字在介面中編寫私有和私有靜態方法。
這些私有方法與其他類私有方法相似,它們之間沒有區別。
public interface Card{
private Long createCardID(){
// Method implementation goes here.
}
private static void displayCardDetails(){
// Method implementation goes here.
}
}
模組系統是Java 9特性之一。 Oracle公司將引入以下功能作為Jigsaw
專案的一部分。
在Java SE 9版本之前,使用Monolithic Jars來開發基於Java的應用程式。 這種架構有很多限制和缺點。 為了避免所有這些缺陷,Java SE 9隨模組系統一起提供。
JDK 9即將推出92
個模組(可能會在最終版本中發生變化)。 我們可以使用JDK模組,也可以建立自己的模組,如下所示:
簡單模組範例
module com.foo.bar { }
這裡我們使用'module'
關鍵字來建立一個簡單的模組。 每個模組都有一個名稱,相關的程式碼和其他資源。
Java SE 9即將在Process API中進行一些改進。他們增加了一些新的類和方法來簡化作業系統進程的控制和管理。
Process API中有兩個新的介面:
java.lang.ProcessHandle
java.lang.ProcessHandle.Info
Process API範例
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());
我們知道,Java SE 7引入了一個新的例外處理結構:Try-With-Resources
來自動管理資源。 這個新宣告的主要目標是「自動更好的資源管理」。
Java SE 9將對此語句進行一些改進,以避免更多冗長並提高某些可讀性。
Java SE 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 SE 9範例
void testARM_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
在Java SE 9中,Oracle Corp將改進CompletableFuture API
來解決Java SE 8中出現的一些問題。它們將增加支援一些延遲和超時,一些實用方法和更好的子分類。
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
這裡delayedExecutor()
是靜態工具方法,用於返回一個新的Executor
,它在給定的延遲後將任務提交給預設執行程式。
現在,反應式程式設計在開發應用程式以獲得一些優點方面變得非常流行。 Scala,Play,Akka等。框架已經整合了Reactive Streams並獲得許多好處。 Oracle Corps還在Java SE 9中引入了新的Reactive Streams API。
Java SE 9 Reactive Streams API是一個發布/訂閱框架,可以使用Java語言輕鬆實現非同步,可伸縮和並行應用程式。
Java SE 9引入了以下API來開發基於Java的應用程式中的Reactive Streams。
java.util.concurrent.Flow
java.util.concurrent.Flow.Publisher
java.util.concurrent.Flow.Subscriber
java.util.concurrent.Flow.Processor
我們知道,Java SE 7引入了一項新功能:菱形運算子,以避免冗餘程式碼和冗長,以提高可讀性。 但是,在Java SE 8中,Oracle Corp(Java Library Developer)發現在使用帶有匿名內部類的菱形(Diamond)操作符方面存在一些限制。 他們已經修復了這些問題並將作為Java 9的一部分發布。
public List getEmployee(String empid){
// Code to get Employee details from Data Store
return new List(emp){ };
}
這裡只使用List
而不指定型別引數。
在Java SE 9中,Oracle公司為java.util.Optional
類新增了一些有用的新方法。 在這裡將通過一些簡單的例子來討論其中的一種方法:流方法
如果給定Optional
物件中存在一個值,則此stream()
方法將返回具有該值的順序Stream
。 否則,它將返回一個空流。
已經新增了stream()
方法來延遲處理Optional
物件,如下所示:
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
這裡使用Optional.stream()
方法將Employee
物件的一個可選的Stream
轉換為一個Employee
流,以便可以在結果程式碼中懶處理這個結果。
在Java SE 9中,Oracle Corp為java.util.Stream
介面新增了四個有用的新方法。 由於Stream是一個介面,所有這些新實現的方法都是預設方法。 其中兩個非常重要:dropWhile
和takeWhile
方法
如果您熟悉Scala語言或任何函式程式設計語言,您一定會了解這些方法。 在編寫一些功能樣式程式碼時,這些是非常有用的方法。 在這裡我們討論takeWhile
實用方法。
這個takeWhile()
將一個謂詞作為引數,並返回給定Stream
值的一個子集的Stream
,直到Predicate
返回false
。 如果第一個值不滿足該謂詞,它只會返回一個空的流。
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
在Java SE 8和更早版本中,@Deprecated
註釋只是一個沒有任何方法的Marker
介面。 它用於標記一個Java API,它是一個類,欄位,方法,介面,建構函式,列舉等。
在Java SE 9中,Oracle Corp增強了@Deprecated
注釋以提供有關不推薦使用的API的更多資訊,並提供了一個工具來分析應用程式對不推薦使用的API的靜態使用情況。 他們新增了兩個方法到這個Deprecated
介面:forRemoval
和自此來提供這些資訊。
在Java SE 9中,Oracle Corp將發布新的HTTP 2用戶端API以支援HTTP/2協定和WebSocket功能。 由於現有的或傳統的HTTP用戶端API有許多問題(例如支援HTTP/1.1協定,不支援HTTP/2協定和WebSocket
,只能在阻塞模式和大量效能問題下工作),他們用新的HTTP替換了這個HttpURLConnection API 客戶。
他們將在java.net.http
包下引入新的HTTP 2用戶端API。 它支援HTTP/1.1
和HTTP/2
協定。 它支援同步(阻塞模式)和非同步模式。 它支援使用WebSocket API的非同步模式。
HTTP2用戶端範例
jshell> import java.net.http.*
jshell> import static java.net.http.HttpRequest.*
jshell> import static java.net.http.HttpResponse.*
jshell> URI uri = new URI("http://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> http://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()))
在Java SE 9中,甲骨文公司將推出一種新的多解析度影象API。 此API中的重要介面是MultiResolutionImage
,它在java.awt.image
包中可用。
MultiResolutionImage
封裝了一組具有不同高度和寬度(即不同解析度)的影象,並允許我們按照自己的要求查詢它們。