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

参考链接

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