Java 9 是一個重要的版本,為開發人員帶來了許多功能。 在這篇文章中,我們將詳細介紹 Java 9 的功能。
Java 10 已經發布,要完整了解 Java 10 的發布情況,請參閱Java 10 功能。
Java 9 功能
- Java 9 REPL(JShell)
- 不可變 List、Set、Map 和 Map.Entry 的工廠方法
- 接口中的私有方法
- Java 9 模塊系統
- 進程 API 改進
- 優化的 Try With Resources
- CompletableFuture API 改進
- 反應式流
- 匿名內部類的 Diamond 運算子
- Optional 類的改進
- 流 API 改進
- 增強的@Deprecated標記
- HTTP 2 客戶端
- 多分辨率圖像 API
- 其他 Java 9 功能
Oracle 公司計劃在 2017 年 3 月底左右發布 Java SE 9。在這篇文章中,我將簡要討論一些 Java 9 功能,並附上一些示例。
Java 9 REPL(JShell)
Oracle 公司推出了一個名為“jshell”的新工具。它代表Java Shell,也被稱為REPL(讀取評估打印循環)。它用於非常輕鬆地執行和測試任何Java結構,如類,接口,枚舉,對象,語句等。我們可以從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
如果你想了解更多關於REPL工具的信息,請參閱Java 9 REPL基礎知識(第1部分)和Java 9 REPL功能(第2部分)。
Immutable List、Set、Map 和 Map.Entry 的工廠方法
Oracle 公司推出了一些方便的工廠方法來創建不可變的 List、Set、Map 和 Map.Entry 對象。這些實用方法用於創建空的或非空的 Collection 對象。在 Java SE 8 和更早的版本中,我們可以使用 Collections 類的實用方法,如 unmodifiableXXX
來創建不可變的 Collection 對象。例如,如果我們想創建一個不可變的 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 具有兩組方法:of()
方法和 ofEntries()
方法分別用於創建不可變的 Map 對象和不可變的 Map.Entry 對象。空 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”關鍵字在接口中編寫私有和私有靜態方法。這些私有方法與其他類的私有方法一樣,它們之間沒有區別。
public interface Card{
private Long createCardID(){
// 方法實現在這裡。
}
private static void displayCardDetails(){
// 方法實現在這裡。
}
}
如果您想了解更多有關此新功能的信息,請查看此鏈接:Java 9接口中的私有方法。
Java 9 模組系統
Java 9 的重要變化之一或特點是模組系統。Oracle 公司將作為 Jigsaw 項目 的一部分引入以下功能。
- 模組化 JDK
- 模組化 Java 源代碼
- 模組化運行時映像
- 封裝 Java 內部 API
- Java 平台模組系統
在 Java SE 9 版本之前,我們使用單體 JAR 開發基於 Java 的應用程序。這種架構有很多限制和缺點。為了避免所有這些缺點,Java SE 9 將推出模組系統。JDK 9 將提供 92 個模組(最終版本可能會有所變化)。我們可以使用 JDK 模組,也可以創建自己的模組,如下所示:簡單模組示例
module com.foo.bar { }
在這裡,我們使用 ‘module’ 創建一個簡單的模組。每個模組都有名稱、相關代碼和其他資源。要了解更多有關這個新架構的詳細信息和實際操作經驗,請查看我的原始教程:
進程 API 改進
Java SE 9 將帶來一些進程 API 改進。他們新增了一些新的類和方法,以便更輕鬆地控制和管理 OS 進程。進程 API 中的兩個新接口:
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
進程 API 示例
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());
嘗試使用資源改進
我們知道,Java SE 7 引入了一個新的異常處理結構:嘗試使用資源來自動管理資源。這個新語句的主要目標是“自動更好的資源管理”。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 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 改進
CompletableFuture API 改進
在Java SE 9中,Oracle Corp將改進CompletableFuture API以解決Java SE 8中提出的一些問題。他們將新增對一些延遲和超時的支持,一些實用方法以及更好的子類別化。
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
這裡的delayedExecutor()是一個靜態實用方法,用於在給定的延遲後將任務提交給默認執行程序的新Executor。
Reactive Streams
如今,反應式編程在開發應用程序中變得非常流行,以獲得一些美好的好處。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庫開發人員)發現了一些在使用鑽石操作符與匿名內部類時的限制。他們已經修復了這些問題,並將它們作為Java 9的一部分發布。
public List getEmployee(String empid){
// 從數據存儲庫獲取員工詳細信息的代碼
return new List(emp){ };
}
在這裡,我們僅使用“List”而不指定類型參數。
Optional類的改進
在Java SE 9中,Oracle Corp向java.util.Optional类添加了一些有用的新方法。这里我将讨论其中一个方法,并附带一些简单的示例:stream方法。如果给定的Optional对象中存在值,此stream()方法将返回一个具有该值的顺序流。否则,它将返回一个空流。他们添加了“stream()”方法,以便在Optional对象上延迟处理,如下所示:
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
在此示例中,Optional.stream()方法用于将Optional的Employee对象流转换为Employee对象流,以便我们可以在结果代码中延迟处理此结果。要了解更多关于此功能的信息以及Optional类中添加的新方法的更多示例,请参阅我原始教程:Java SE 9:Optional类改进
Stream API改进
在Java SE 9中,Oracle Corp已向java.util.Stream接口添加了四个有用的新方法。由于Stream是一个接口,所有这些新实现的方法都是默认方法。其中两个非常重要:dropWhile和takeWhile方法。如果您熟悉Scala语言或任何函数式编程语言,您肯定会了解这些方法。这些方法在编写一些函数式风格代码时非常有用。让我们在这里讨论takeWhile实用方法。takeWhile()接受一个断言作为参数,并返回给定Stream值的子集的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
Enhanced @Deprecated annotation
在Java SE 8及之前的版本中,@Deprecated注釋只是一個沒有任何方法的標記接口。它用於標記Java API,即類、字段、方法、接口、構造函數、枚舉等。在Java SE 9中,Oracle Corp已增強了@Deprecated注釋,以提供有關不推薦使用的API的更多信息,並提供了一個工具來分析應用程序對已棄用API的靜態使用情況。他們向此Deprecated接口添加了兩個方法:forRemoval和since以提供此信息。
HTTP 2 Client
在Java SE 9中,Oracle Corp將推出新的HTTP 2 Client API來支援HTTP/2協議和WebSocket功能。由於現有的或遺留的HTTP Client API存在許多問題(如僅支援HTTP/1.1協議,不支援HTTP/2協議和WebSocket,僅以阻塞模式工作且存在許多性能問題),因此他們正在將此HttpURLConnection API替換為新的HTTP客戶端。他們將在“java.net.http”包下引入一個新的HTTP 2 Client API。它支援HTTP/1.1和HTTP/2協議,支援同步(阻塞模式)和非同步模式,並使用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()))
請參閱我的原始教程:Java SE 9:HTTP 2 Client以了解HTTP/2協議和WebSocket、新API的好處以及舊API的缺點,並附上一些有用的示例。
多分辨率圖像API
在Java SE 9中,Oracle Corp將推出一個新的多分辨率圖像API。此API中的重要接口是MultiResolutionImage,位於java.awt.image包中。MultiResolutionImage封裝了一組具有不同高度和寬度(即不同分辨率)的圖像,並允許我們根據需求查詢它們。
Java 9 其他功能
在本部分中,我將列出一些雜項的 Java SE 9 新功能。我並不是說這些功能不重要。它們同樣重要且有用,需要透過一些實用的例子深入理解。截至目前,我尚未獲得有關這些功能的足夠信息。這就是為什麼我要在這裡列出它們以便簡要理解。我將逐一選取這些功能,並在上面的部分中添加簡要的討論和示例。最後,稍後會撰寫一篇獨立的教程。
- 垃圾回收器(Garbage Collector)改進
- 堆疊行走 API
- 過濾傳入序列化數據
- 棄用 Applet API
- Indify 字符串連接
- 增強的方法處理
- Java 平台日誌 API 和服務
- 緊湊字符串
- Nashorn 解析器 API
- Javadoc 搜索
- HTML5 Javadoc
I will pickup these java 9 features one by one and update them with enough description and examples. That’s all about Java 9 features in brief with examples.
Source:
https://www.digitalocean.com/community/tutorials/java-9-features-with-examples