美文网首页
Java9新特性

Java9新特性

作者: JWking | 来源:发表于2019-07-30 10:31 被阅读0次

    Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接下来我们会详细介绍 Java 9 的新特性。

特性

模块系统:模块是一个包的容器,Java 9 最大的变化之一是引入了模块系统(Jigsaw 项目)。

REPL (JShell):交互式编程环境。

HTTP 2 客户端:HTTP/2标准是HTTP协议的最新版本,新的 HTTPClient API 支持 WebSocket 和 HTTP2 流以及服务器推送特性。

改进的 Javadoc:Javadoc 现在支持在 API 文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。

多版本兼容 JAR 包:多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本。

集合工厂方法:List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例。

私有接口方法:在接口中使用private私有方法。我们可以使用 private 访问修饰符在接口中编写私有方法。

进程 API: 改进的 API 来控制和管理操作系统进程。引进 java.lang.ProcessHandle 及其嵌套接口 Info 来让开发者逃离时常因为要获取一个本地进程的 PID 而不得不使用本地代码的窘境。

改进的 Stream API:改进的 Stream API 添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询。

改进 try-with-resources:如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。

改进的弃用注解 @Deprecated:注解 @Deprecated 可以标记 Java API 状态,可以表示被标记的 API 将会被移除,或者已经破坏。

改进钻石操作符(Diamond Operator) :匿名类可以使用钻石操作符(Diamond Operator)。

改进 Optional 类:java.util.Optional 添加了很多新的有用方法,Optional 可以直接转为 stream。

多分辨率图像 API:定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了。

改进的 CompletableFuture API : CompletableFuture 类的异步机制可以在 ProcessHandle.onExit 方法退出时执行操作。

轻量级的 JSON API:内置了一个轻量级的JSON API。

响应式流(Reactive Streams) API: Java 9中引入了新的响应式流 API 来支持 Java 9 中的响应式编程。

1、模块系统

    模块就是代码和数据的封装体。模块的代码被组织成多个包,每个包中包含Java类和接口;模块的数据则包括资源文件和其他静态信息。Java 9 模块的重要特征是在其工件(artifact)的根目录中包含了一个描述模块的 module-info.class 文 件。 工件的格式可以是传统的 JAR 文件或是 Java 9 新增的 JMOD 文件。这个文件由根目录中的源代码文件 module-info.java 编译而来。该模块声明文件可以描述模块的不同特征。

//在 module-info.java 文件中,可以用新的关键词module来声明一个模块:module com.module {...}

//在 src同级目录下创建mods文件夹,然后在该目录下创建 com.runoob.greetings 文件夹,将模块编译到该目录下。

2、REPL(JShell):

    JShell 是 Java 9 新增的一个交互式的编程环境工具。它允许你无需使用类或者方法包装来执行 Java 语句。它与 Python 的解释器类似,可以直接 输入表达式并查看其执行结果。

3、javadoc 工具:

    可以生成 Java 文档, Java 9 的 javadoc 的输出现在符合兼容 HTML5 标准。

4、多版本兼容 JAR 包

    使用多版本兼容 JAR 功能将 java 文件生成两个版本的 jar 包, 一个是 jdk 7,另一个是 jdk 9,然后在不同环境下执行。

5、集合工厂方法:

    Java 9 List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例。

//List 和 Set 接口, of(...) 方法重载了 0 ~ 10 个参数的不同方法 。

//Map 接口, of(...) 方法重载了 0 ~ 10 个参数的不同方法 。

//Map 接口如果超过 10 个参数, 可以使用 ofEntries(...) 方法。

6、私有接口方法:

    在 Java 8之前,接口可以有常量变量和抽象方法。不能在接口中提供方法实现。如果要提供抽象方法和非抽象方法(方法与实现)的组合,那么就得使用抽象类。

    在 Java 8 接口引入了一些新功能——默认方法和静态方法。我们可以在Java SE 8的接口中编写方法实现,仅仅需要使用 default 关键字来定义它们。

    Java 9 不仅像 Java 8 一样支持接口默认方法,同时还支持私有方法。

7、改进的进程 API:

    在 Java 9 之前,Process API 仍然缺乏对使用本地进程的基本支持。

    Java 9 向 Process API 添加了一个名为 ProcessHandle 的接口来增强 java.lang.Process 类。

    ProcessHandle 接口的实例标识一个本地进程,允许查询进程状态并管理进程。

    ProcessHandle 嵌套接口 Info 来让开发者逃离时常因为要获取一个本地进程的 PID 而不得不使用本地代码的窘境。

    ProcessHandle 接口中声明的 onExit() 方法可用于在某个进程终止时触发某些操作。

8、改进的 Stream API:

    Java 9 为 Stream 新增了几个方法:dropWhile、takeWhile、ofNullable,为 iterate 方法新增了一个重载方法。

    takeWhile() 方法使用一个断言作为参数,返回给定 Stream 的子集直到断言语句第一次返回 false。如果第一个值不满足断言条件,将返回一个空的 Stream。

takeWhile() 方法在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素;在无序的 Stream 中,takeWhile 返回从开头开始的符合 Predicate 要求的元素的子集。

Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty()) .forEach(System.out::print);//碰到空字符串时停止循环输出。

Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty()) .forEach(System.out::print);//碰到空字符串时开始循环输出

count = Stream.ofNullable(null).count();//空元素返回空流,输出0,非空元素则获取一个元素并生成单个元素流。

9、改进的 try-with-resources:

    try-with-resources 是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。

    try-with-resources 声明在 JDK 9 已得到改进。如果已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。

10、@Deprecated (since=""/forRemoval="")

    标记 Java API 状态,可以是以下几种:

        使用它存在风险,可能导致错误

        可能在未来版本中不兼容

        可能在未来版本中删除

        一个更好和更高效的方案已经取代它。

    Java 9 中注解增加了两个新元素:since 和 forRemoval

        since: 元素指定已注解的API元素已被弃用的版本。

        forRemoval: 元素表示注解的 API 元素在将来的版本中被删除,应该迁移 API。

11、钻石操作符(Diamond Operator):

    在 java 7 中引入的,可以让代码更易读,但它不能用于匿名的内部类。

    在 java 9 中, 可以与匿名的内部类一起使用。

12、改进的 Optional 类:

    在 java 9 中, 添加了三个方法来改进它的功能:stream(),ifPresentOrElse(),or()。

    stream 方法的作用就是将 Optional 转为一个 Stream,如果该 Optional 中包含值,那么就返回包含这个值的 Stream,否则返回一个空的 Stream(Stream.empty())。

//语法public Stream<T> stream()

    ifPresentOrElse 方法的改进就是有了 else,接受两个参数 Consumer 和 Runnable。ifPresentOrElse 方法的用途是,如果一个 Optional 包含值,则对其包含的值调用函数 action,即 action.accept(value),这与 ifPresent 一致;与 ifPresent 方法的区别在于,ifPresentOrElse 还有第二个参数 emptyAction —— 如果 Optional 不包含值,那么 ifPresentOrElse 便会调用 emptyAction,即 emptyAction.run()。

//语法public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

    or()方法如果值存在,返回 Optional 指定的值,否则返回一个预设的值。

//语法public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

13、多分辨率图像的API:

    Image getResolutionVariant(double destImageWidth, double destImageHeight) − 获取特定分辨率的图像变体-表示一张已知分辨率单位为DPI的特定尺寸大小的逻辑图像,并且这张图像是最佳的变体。

// 根据不同尺寸获取对应的图像分辨率 Image variant1 = multiResolutionImage.getResolutionVariant(156, 45);

      System.out.printf("\nImage for destination[%d,%d]: [%d,%d]",

        156, 45, variant1.getWidth(null), variant1.getHeight(null));

    List<Image> getResolutionVariants() − 返回可读的分辨率的图像变体列表。

List<Image> variants = multiResolutionImage.getResolutionVariants();

      System.out.println("Total number of images: " + variants.size());

      for (Image img : variants) {        System.out.println(img);

      }

相关文章

  • Java11的新特性

    Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的...

  • Java15的新特性

    Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的...

  • Java12的新特性

    Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的...

  • Java9 新特性官档翻译 (轻喷)

    Java9 新特性 翻译自 : https://docs.oracle.com/javase/9/whatsnew...

  • java9的新特性

    1、Java9 新特性之---目录结构 包含jdk8及以前的jdk版本,所有目录结构以及目录含义如图: 这个新特性...

  • java9新特性

    1、模块化系统:Jigsaw->Modularity 解决越来越臃肿 的java运行环境。 主要目的在于减少...

  • Java9新特性

    作者:「Rambabu Posa」,一个具有 11 年丰富开发经验的技术牛人。 英文出处:Java 9 Featu...

  • Java9新特性

    Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接...

  • 一、java前期准备:(2)java、eclipse并写两个小程

    1、下载java8 目前最新的java9,增加了一些新的特性,在官网的首页上当然也是java9,如果想下载jdk ...

  • java9 模块化初体验

    java9发布有一段时间了,模块化是java9的一个重要新特性。今天有时间,就体验一把java9的模块化功能。 创...

网友评论

      本文标题:Java9新特性

      本文链接:https://www.haomeiwen.com/subject/tqairctx.html