Java 做爲 Android 的基礎編程語言,每一次迭代也是備受安卓開發人員的關注。這不,Oracle 公司在今年即將發佈 Java 9 正式版,一些新的特性和改進非常值得期待。html
週末時間,拜讀了國外的一個 Java 大牛寫的有關 Java SE 9 的新功能介紹,簡明扼要,示例得當。因而,一時興起,以拙劣的英語水平磕磕絆絆翻譯至此,供你們瞭解一番。java
做者:「Rambabu Posa」,一個具備 11 年豐富開發經驗的技術牛人。react
英文出處:Java 9 Features with Examples程序員
Oracle 公司即將在 2017 年 3 月底正式發佈 Java SE 9。在這篇文章,我將使用一些示例簡明扼要地闡述 Java 9 的新特性。固然,也是時候去了解一下。shell
Oracle 公司(Java Library 開發者)新引進一個表明 Java Shell 的稱之爲 「jshell」 或者 REPL(Read Evaluate Print Loop)的新工具。該工具能夠被用來執行和測試任何 Java 中的結構,如 class,interface,enum,object,statements 等。使用很是簡單。編程
JDK 9 EA(Early Access)下載地址:jdk9.java.net/download/api
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複製代碼
有關 REPL 工具的更多信息,可訪問 Java 9 REPL Basics (Part-1) 和 Java 9 REPL Features (Part-2).微信
Oracle 公司引入一些方便使用的工廠方法,用於建立不可變集合 List,Set,Map 和 Map.Entry 對象。這些高效實用的方法可用來建立空或者非空集合對象。架構
在 Java SE 8 和更早版本中,咱們經常使用相似 unmodifiableXXX 的集合類方法建立不可變集合對象。舉個例子,好比咱們想建立一個不可變的 List 對象,可能使用到 Collections.unmodifiableList
方法。框架
然而,這些 Collections.unmodifiableXXX
方法顯得很是冗長乏味。爲了克服這些缺陷,Oracle 公司給 List、Set 和 Map 接口分別添加了兩個更加實用的方法。
List 和 Set 接口使用 of()
方法建立一個空或者非空的不可變 List 或 Set 對象,如:
空 List 示例
List immutableList = List.of();複製代碼
非空 List 示例
List immutableList = List.of("one","two","three");複製代碼
Map 分別有兩個方法用於建立不可變 Map 對象和不可變 Map.Entry 對象:of()
和 ofEntries()
。
空 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}複製代碼
更多有關這些實用方法的信息,能夠經過這些連接查詢:
在 Java 8 中,咱們能夠在接口中使用默認或者靜態方法提供一些實現方式,可是不能建立私有方法。
爲了不冗餘代碼和提升重用性,Oracle 公司準備在 Java SE 9 接口中引入私有方法。也就是說從 Java SE 9 開始,咱們也可以在接口類中使用 ‘private’ 關鍵字寫私有化方法和私有化靜態方法。
接口中的私有方法與 class 類中的私有方法在寫法上並沒有差別,如:
public interface Card{
private Long createCardID(){
// Method implementation goes here.
}
private static void displayCardDetails(){
// Method implementation goes here.
}
}複製代碼
有關接口私有方法新特性的更多信息,可訪問個人初體驗之:Java 9 Private methods in Interface。
Java 9 新特性中最大的一個變化就是 Module System。Oracle 公司將引入以下特性做爲 Jigsaw Project 的一部分:
Java SE 9 版本以前,咱們使用 Monolithic Jars 來開發基於 Java 語言的應用程序。這種體系架構有許多侷限性和缺點。爲了不這些缺陷,Java SE 9 迎來了 Module System。
JDK 9 包含有 92 個 modules(固然也可能在最終發佈版中有所變化)。咱們可使用 JDK Modules,也能建立咱們本身的 modules,如:
簡單 Module 示例
module com.foo.bar { }複製代碼
這裏咱們使用 module
關鍵字建立了一個簡單的 module。每一個 module 都有一個名字,對應代碼和其它一些資源。
想了解更多有關這個新體系架構和親自動手體驗的話,能夠參考這裏個人體驗之:
Java SE 9 迎來一些 Process API 的改進,經過添加一些新的類和方法來優化系統級進程的管控。
Process API 中的兩個新接口:
Process API 示例
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());複製代碼
想了解更多新 API 的信息,能夠經過參考個人初體驗之:Java SE 9: Process API Improvements。
咱們知道,Java SE 7 引入了一個新的異常處理結構:Try-With-Resources
,來自動管理資源。這個新的聲明結構主要目的是實現「Automatic Better Resource Management」(「自動資源管理」)。
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 9 Try-With-Resources Improvements
在 Java SE 9 中,Oracle 公司將改進 CompletableFuture API 來解決一些 Java SE 8 中出現的問題。這些被添加的 API 將用來支持一些延時和超時操做,實用方法和更好的子類化。
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);複製代碼
這裏的 delayedExecutor() 是靜態實用方法,用來返回一個在指定延時時間提交任務到默認執行器的新 Executor 對象。
有關這個特性的更多信息,請訪問個人初體驗之:Java SE 9: CompletableFuture API Improvements。
如今,Reactive Programming 因爲其便利性在應用程序開發中變得很是流行。Scala、Play、Akka 等框架已經集成 Reactive Streams 而且受益良多。Oracle 公司也在 Java SE 9 中引入了一個新的 Reactive Streams API。
Java SE 9 Reactive Streams API 是一個發佈訂閱型框架,使咱們可以很是簡單地使用 Java 語言就能實現異步的、可拓展的和並行的應用。
Java SE 9 引進下面這些 API 來在基於 Java 語言的應用中開發 Reactive Streams:
若是你想了解這個新 API 的更多信息,能夠參考個人初體驗之:Introduction to Reactive Programming and Java SE 9: Reactive Streams。
咱們知道,Java SE 7 引入了一個新的特性:Diamond Operator,來避免冗長代碼和提高可讀性。然而在 Java SE 8 中,Oracle 公司發如今 Diamond 操做器和匿名內部類的使用中存在一些侷限性,後來修復了這些問題並準備將其做爲 Java 9 的一部分發布出去。
public List getEmployee(String empid){
// Code to get Employee details from Data Store
return new List(emp){ };
}複製代碼
在 Java SE 9 中,Oracle 公司添加了一些新的實用方法到 java.util.Optional
類裏面。這裏我將使用一些簡單的示例來描述其中的一個:stream 方法。
若是一個值出如今給定 Optional 對象中,stream() 方法能夠返回包含該值的一個順序 Stream 對象。不然,將返回一個空 Stream。
stream()
方法已經被添加,並用來在 Optional 對象中使用,如:
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)複製代碼
這裏的 Optional.stream()
方法被用來轉化 Employee 可選流對象 到 Employee 流中,如此咱們即可以在後續代碼中使用這個結果。
理解這個特性的更多信息,可參考個人初體驗過程:Java SE 9: Optional Class Improvements。
在 Java SE 9 中,Oracle 公司添加了四個很是有用的新方法到 java.util.Stream
接口裏面。正如 Stream 做爲一個接口類,全部這些新的實現方法都是默認方法。其中有兩個方法很是重要:dropWhile 和 takeWhile。
若是你熟悉 Scala 語言或者其它函數編程語言的話,你必定知道這些方法。他們在寫一些功能樣式代碼時很是有用。這裏咱們一塊兒討論一下 takeWhile 實用方法。
這個 takeWhile()
方法使用一個斷言做爲參數,返回給定 Stream 的子集直到斷言語句第一次返回 false。若是第一個值不知足斷言條件,將返回一個空的 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複製代碼
更多有關 takeWhile、dropWhile 和其它新方法的信息,能夠參考個人初體驗過程之:Java SE 9: Stream API Improvements。
在 Java SE 8 和更早版本上,@Deprecated 註解只是一個沒有任何方法的標記類接口。它的做用是標記一個 Java API,能夠是 calss,field,method,interface,constructor 等。
在 Java SE 9 中,Oracle 公司強化了 @Deprecated 註解,來提供更多有關廢棄 API 的介紹信息,同時也提供一個工具來分析項目中的廢棄 API 的靜態使用狀況。Oracle 公司添加了兩個方法到 Deprecated 接口中來提供服務:forRemoval 和 since。
在 Java SE 9 中,Oracle 公司將發佈新的 HTTP 2 Client API 來支持 HTTP/2 協議和 WebSocket 特性。現有的 HTTP Client API 存在不少問題(如支持 HTTP/1.1 協議可是不支持 HTTP/2 協議和 WebSocket,僅僅做用在 Blocking 模式中,並存在大量性能問題),他們正在被使用新的 HTTP 客戶端的 HttpURLConnection API 所替代。
Oracle 公司準備在 「java.net.http」 包下引入新的 HTTP 2 Client API。它將同時支持 HTTP/1.1 和 HTTP/2 協議,也同時支持同步(Blocking Mode)和異步模式,支持 WebSocket API 使用中的異步模式。
咱們能夠在這裏查看這個新 API 信息:download.java.net/java/jdk9/d…。
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("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: HTTP 2 Client,理解 HTTP/2 協議和 WebSocket,以及使用一些有用的示例對比新 API 的優點和舊 OLD API 的缺陷。
在 Java SE 9 中,Oracle 公司將引入一個新的 Мulti-Resolution Image API。這個 API 中比較重要的接口是 MultiResolutionImage
,在 java.awt.image
包下可獲取到。
MultiResolutionImage
封裝不一樣高度和寬度圖片(不一樣解決方案)到一個集合中,並容許咱們按需查詢使用。
想理解這個 API 的更多信息,可參考個人初體驗之:Java SE 9: Мulti-Resolution Image API。
在這個部分,我將列出 Java SE 9 新特性中其它一些內容。固然,這並非這些內容就不重要。使用一些示例去理解他們也是很是重要而且很實用的。
截至目前,我並無獲取到這些特性的足夠多信息。這就是爲何我將他們簡單列舉至此的緣由。我也會一個一個去獲取信息並採用一些示例來講明這個部分列舉的特性內容。而且會在晚些寫成一個獨立的體驗部分。
後面我將逐個蒐集這些 java 9 中的特性,並使用足夠的描述性文字和示例代碼予以解釋。
至此,上述就是 java 9 中全部新引進的特性,一些簡介和示例代碼。
安卓筆記俠:專一於 Android 開發,和程序員之路。