java9

在這裏插入圖片描述
java9

近幾年來JDK更新飛快,目前最近的更新JDK是ORACLE於2019年9月16日更新的JDK13。並且ORACLE計劃於2020年3月發佈的JDK14。不得不說,更新速度太快了,一個版本的特性還沒有摸熟,新的就已經推出了。當然了,我們在企業開發中,JDK的版本當然不會隨着ORACLE的更新而更新,而是根據自身的需要來選擇合適的版本。

目前國內大多數公司使用的JDK版本都是JDK1.8。但是可以預見的是,在幾年之後,也會有很多公司去選擇使用JDK9、JDK10等等。作爲開發人員,必須清楚的瞭解到JDK都更新了哪些內容,以便我們更好的完成開發工作。(雖然現在ORACLE推薦直接跳過JDK9,直接更新到JDK10.)

Java 9 包含了豐富的特性集。雖然Java 9沒有新的語言概念,但是有開發者感興趣的新的API和診斷命令。

  1. 模塊系統

Java 9中主要的變化是已經實現的模塊化系統。

模塊就是代碼和數據的封裝體。模塊的代碼被組織成多個包,每個包中包含Java類和接口;模塊的數據則包括資源文件和其他靜態信息。

Java 9 模塊的重要特徵是在其工件(artifact)的根目錄中包含了一個描述模塊的 module-info.class 文 件。 工件的格式可以是傳統的 JAR 文件或是 Java 9 新增的 JMOD 文件。這個文件由根目錄中的源代碼文件 module-info.java 編譯而來。該模塊聲明文件可以描述模塊的不同特徵。

在 module-info.java 文件中,我們可以用新的關鍵詞module來聲明一個模塊,如下所示。下面給出了一個模塊com.mycompany.mymodule的最基本的模塊聲明。

module com.runoob.mymodule {
}

創建模塊

接下來我們創建一個 com.runoob.greetings 的模塊。

第一步

創建文件夾 C:>JAVA\src,然後在該目錄下再創建與模塊名相同的文件夾 com.runoob.greetings。

第二步

在 C:>JAVA\src\com.runoob.greetings 目錄下創建 module-info.java 文件,代碼如下:

module com.runoob.greetings { }

module-info.java 用於創建模塊。這一步我們創建了 com.runoob.greetings 模塊。

第三步

在模塊中添加源代碼文件,在目錄 C:>JAVA\src\com.runoob.greetings\com\runoob\greetings 中創建文件 Java9Tester.java,代碼如下:

package com.runoob.greetings;

public class Java9Tester {
   public static void main(String[] args) {
      System.out.println("Hello World!");
   }
}

第四步

創建文件夾 C:>JAVA\mods,然後在該目錄下創建 com.runoob.greetings 文件夾,編譯模塊到這個目錄下:

C:/>JAVA> javac -d mods/com.runoob.greetings 
   src/com.runoob.greetings/module-info.java 
   src/com.runoob.greetings/com/runoob/greetings/Java9Tester.java

第五步

執行模塊,查看輸出結果:

C:/>JAVA> java --module-path mods -m com.runoob.greetings/com.runoob.greetings.Java9Tester
Hello World!

module-path 指定了模塊所在的路徑。

-m 指定主要模塊。

  1. JShell

用過Python的同學都知道,Python 中的讀取-求值-打印循環( Read-Evaluation-Print Loop )很方便。它的目的在於以即時結果和反饋的形式。

java9引入了jshell這個交互性工具,讓Java也可以像腳本語言一樣來運行,可以從控制檯啓動 jshell ,在 jshell 中直接輸入表達式並查看其執行結果。當需要測試一個方法的運行效果,或是快速的對表達式進行求值時,jshell 都非常實用。

除了表達式之外,還可以創建 Java 類和方法。jshell 也有基本的代碼完成功能。我們在教人們如何編寫 Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話。

怎麼理解,怎麼用呢?這個只是針對於java9來說,相當於cmd工具,你可以和cmd一樣,直接寫方法等等,不過我認爲只是適用於初學者做一些最簡單的運算和寫一些方法:

在cmd中打開這個工具:

進入工具後可以做一些簡單的java操作

這個功能對初學者還是挺友好的。

  1. 集合工廠方法

Java 9增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等工廠方法來創建不可變集合。

先看一下在JDK1.8中的簡單示例:

List <Point> myList = new ArrayList <>();
myList.add(new Point(1,1));
myList.add(new Point(2,2));
myList.add(new Point(3,3));
myList.add(new Point(4,4));
myList = Collections.unmodifiableList(myList);

在java 8中,要創建一個包含四個Points不可變列表需要6行代碼。java 9通過工廠的集合方法解決了這個問題。

在java 9中:

List<Point> list = 
    List.of(new Point(1, 1), new Point(2, 2), 
    new Point(3, 3), new Point(4, 4));
  1. 私有接口方法

在java 8中爲接口提供了靜態方法和默認方法。所以接口中可以定義常量、抽象方法、靜態方法和默認方法。而在java 9中,有增加了私有方法。

public interface Test {
    
    // java 7 
    int num = 1;
    
    void doThing();
    
    
    // java 8
    
    static String addString(String s){
        return s + "1";
    }
    
    String printString();
    
    
    // java 9
    
    private void print(String s){
        System.out.println(s);
    }
}

默認方法和靜態方法可以共享接口中的私有方法,因此避免了代碼冗餘,這也使代碼更加清晰。如果私有方法是靜態的,那這個方法就屬於這個接口的。並且沒有靜態的私有方法只能被在接口中的實例調用。

  1. HTTP/2

Java 9 中有新的方式來處理 HTTP 調用。這個遲到的特性用於代替老舊的 HttpURLConnection API,並提供對 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模塊交付。也就是說,這套 API 不能保證 100% 完成。不過你可以在 Java 9 中開始使用這套 API:

HttpClient client = HttpClient.newHttpClient();
 
HttpRequest req =
   HttpRequest.newBuilder(URI.create("http://www.google.com"))
              .header("User-Agent","Java")
              .GET()
              .build();
 
 
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());

HttpResponse resp = client.send(req, HttpResponse.BodyHandler.asString());

除了這個簡單的請求/響應模型之外,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性,比如流和服務端推送。

  1. HTML5風格的Java幫助文檔

Java 8之前的版本生成的Java幫助文檔是在HTML 4中。在Java 9中,Javadoc 的輸出現在符合兼容 HTML5 標準。現在HTML 4是默認的輸出標記語言,但是在之後發佈的JDK中,HTML 5將會是默認的輸出標記語言。

Java幫助文檔還是由三個框架組成的結構構成,這是不會變的,並且以HTML 5輸出的Java幫助文檔也保持相同的結構。每個 Javadoc 頁面都包含有關 JDK 模塊類或接口來源的信息。

  1. 多版本兼容 jar 包

多版本兼容 JAR 功能能讓你創建僅在特定版本的 Java 環境中運行庫程序時選擇使用的 class 版本。

通過 --release 參數指定編譯版本。

具體的變化就是 META-INF 目錄下 MANIFEST.MF 文件新增了一個屬性:

Multi-Release: true

然後 META-INF 目錄下還新增了一個 versions 目錄,如果是要支持 java9,則在 versions 目錄下有 9 的目錄。

multirelease.jar
├── META-INF
│   └── versions
│       └── 9
│           └── multirelease
│               └── Helper.class
├── multirelease
    ├── Helper.class
    └── Main.class
  1. 改進的 Stream API

長期以來,Stream API 都是 Java 標準庫最好的改進之一。在 Java 9 中它會變得更好。Stream 接口中添加了 4 個新的方法:dropWhile, takeWhile, ofNullable。還有個 iterate 方法的新重載方法,可以讓你提供一個 Predicate (判斷條件)來指定什麼時候結束迭代:

IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

第二個參數是一個 Lambda,它會在當前 IntStream 中的元素到達 100 的時候返回 true。因此這個簡單的示例是向控制檯打印 1 到 99。

除了對 Stream 本身的擴展,Optional 和 Stream 之間的結合也得到了改進。現在可以通過 Optional 的新方法 stram 將一個 Optional 對象轉換爲一個(可能是空的) Stream 對象:

Stream<Integer> s = Optional.of(1).stream();

上述幾個特性當然不是java 9特性的全部,這裏只是簡單介紹幾個常用的。其他的特性就需要大家在平時開發過程中學習和使用了。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章