Java 9 新特性

Java 9發佈於2017年9月,目前已停止更新(Java SE 9 has reached end of support. ),是一個non-LTS(Long Term Support)版本,JDK10 發佈於2018年3月,咋看起來,Oracle公司加快了JAVA版本的頻率,但按照Oracle公司的說法,其實並沒有,依然是按照之前的操作慣例,希望每六個月維護一個穩定的“版本更新”(大佬還特意拿Java 8 舉例,比如,Java 8發佈於2014年3月,而8u20發佈於差不多6個月後的8月,8u40也差不多在8u20之後的6個月後發佈)。至於10和11爲什麼不叫9u20、9u40,Oracle公司希望通過簡化JCP流程,能夠做到在很短的時間內就可以引入新的類庫、JVM和語言特性,並且及時向用戶推出,而不是像過去那樣必須等待數年的主要版本更新(這算一種發佈命名策略的改變?),關於這一點,感興趣的可以參考這篇文章:Update and FAQ on the Java SE Release Cadence

圖片來源:https://www.oracle.com/technetwork/java/eol-135779.html

目前JDK最新版本爲JDK11

在這裏插入圖片描述

這裏還是回顧下Java 9 的一些新特性

Java 9 REPL (JShell)

It stands for Java Shell and also known as REPL (Read Evaluate Print Loop). It is used to execute and test any Java Constructs like class, interface, enum, object, statements etc. very easily.

這裏使用JShell 11 做演示

在這裏插入圖片描述

新增集合工廠方法

在以前的版本中,我們通過Collections的unmodifiableXXX方法來創建不可修改集合對象,但這種方式並不是那麼直觀貼切。在新版本中,我們可以通過List 、Set、Map接口的of方法來達到響應的目的。

        List immutableList = List.of("one", "two", "three");
        List emptyImmutableList = List.of();
        System.out.println(immutableList);
        System.out.println(emptyImmutableList);

        Map immutableMap = Map.of(1, "one", 2, "two", 3, "three");
        Map emptyImmutableMap = Map.of();
        System.out.println(immutableMap);
        System.out.println(emptyImmutableMap);

        Map nonEmptyImmutableMap = Map.ofEntries(entry(1, "one"), entry(2, "two"), entry(3, "three"));
        System.out.println(nonEmptyImmutableMap);

執行結果:

[one, two, three]
[]
{3=three, 2=two, 1=one}
{}
{3=three, 2=two, 1=one}

接口中定義私有方法

Java 8中可以通過Default和Static關鍵字來定義默認方法實現,但無法創建私有方法,新版本中可以支持這一操作。

public interface Card{

  private Long createCardID(){
    // Method implementation goes here.
  }

  private static void displayCardDetails(){
    // Method implementation goes here.
  }

}

模塊化

模塊化應該是Java 9中最大的一個變化了。關於模塊化的一些應用示例可參考如下鏈接:

針對Process API改進

新增兩個Process API 接口


        ProcessHandle currentProcess = ProcessHandle.current();
        System.out.println("Current Process Id: = " +currentProcess.getPid());

currentProcess.getPid()方法在JDK11中已經更新爲currentProcess.pid()

針對Try With Resources的改進

Java 7中引入了Try-With-Resources機制實現對資源的自動管理。Java 9針對這個機制進行了優化與改進,以減少代碼冗餘,同時提高代碼的可讀性。在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());
 }
}

針對CompletableFuture API的改進

接口增加支持延遲和超時設置

Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

Reactive Streams

Java 9的響應式Streams API是一個發佈訂閱框架,可以方便的實現異步的、可擴展的、並行處理程序。主要實現類:

  • java.util.concurrent.Flow

  • java.util.concurrent.Flow.Publisher

  • java.util.concurrent.Flow.Subscriber

  • java.util.concurrent.Flow.Processor

針對匿名內部類的Diamond操作符

Java 7中引入了Diamond操作符,就是左右尖括號<>,來避免代碼冗餘,然而在Java 8中針對匿名內部類使用Diamond操作符存在一定的限制,Java 9解決了遺留BUG。

針對Optional類的改進

針對java.util.Optional類,Java 9中新增了一些有用的方法實現,比如stream方法。如果Optional對象中包含值,那麼stream方法將會返回一個包含該值的Stream,否則返回一個空Stream。


Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

針對Stream API 的改進

Java 9中針對java.util.Stream接口新增了四個方法,所有新增的四個方法都是接口中的默認方法,其中兩個比較重要的是dropWhiletakeWhile ,如果你熟悉函數式編程,那麼下面的這種代碼你應該不會陌生。

        Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).takeWhile(i -> i < 5)
                .forEach(System.out::println);

        Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).dropWhile(i -> i < 5)
                .forEach(System.out::println);

@Deprecated 註解增強

在Java 9之前,@Deprecated 只是一個註解接口,不包含任何方法,Java 9中針對@Deprecated新增了sinceforRemoval方法,同時還提供了相應的分析工具來分析@Deprecated的使用情況。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
    /**
     * Returns the version in which the annotated element became deprecated.
     * The version string is in the same format and namespace as the value of
     * the {@code @since} javadoc tag. The default value is the empty
     * string.
     *
     * @return the version string
     * @since 9
     */
    String since() default "";

    /**
     * Indicates whether the annotated element is subject to removal in a
     * future version. The default value is {@code false}.
     *
     * @return whether the element is subject to removal
     * @since 9
     */
    boolean forRemoval() default false;
}

HTTP 2 Client

HTTP2 Client位於java.net.http包下,同時支持HTTP/1.1 和HTTP/2協議,及同步、異步模式,支持異步模式使用WebSocket API

更多可參考:http://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html

Multi-Resolution Image API

java.awt.image 包中新增MultiResolutionImage接口,**MultiResolutionImage **通過封裝不同尺寸的圖片集來允許我們根據不同的需求來檢索。

其他一些特性

除上述討論的一些特性之外,Java 9還涉及引入了以下新特性:

  • 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

參考鏈接

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