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特性的全部,这里只是简单介绍几个常用的。其他的特性就需要大家在平时开发过程中学习和使用了。

在这里插入图片描述

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