Java9新特性

    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);

      }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容