1.Java 9 REPL (JShell) - 交互式编程环境
JShell 是 Java 9 新增的一个交互式的编程环境工具,允许无需使用类或者方法包来执行 Java 语句,可以直接 输入表达式并查看其执行结果。
执行 JSHELL
$ jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell>
查看 JShell 命令
输入 /help 可以查看 JShell相关的命令:jshell> /help
JShell 执行计算
jshell> 13%7
$2 ==> 6
jshell> $2
$2 ==> 6
JShell 创建与使用函数
jshell> int doubled(int i){ return i*2;}
| created method doubled(int)
jshell> doubled(6)
$3 ==> 12
退出 JShell jshell> /exit
参考:https://www.journaldev.com/13121/java-9-features-with-examples#private-methods https://www.journaldev.com/9879/java-repl-jshell
List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例, 以更简洁的方式来创建集合。
新方法添加到 List,Set 和 Map 接口以及它们的重载对象。EG:
static List of(E e1, E e2, E e3);
static Set of(E e1, E e2, E e3);
static Map of(K k1, V v1, K k2, V v2, K k3, V v3);
static Map ofEntries(Map.Entry extends K,? extends V>... entries)
JDK 9 DEMO
Set set = Set.of("A", "B", "C");
List list = List.of("A", "B", "C");
Map map = Map.of("A","Apple","B","Boy","C","Cat");
JDK 9以前DEMO
Set set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
set = Collections.unmodifiableSet(set);
System.out.println(set);
参考:https://www.journaldev.com/13121/java-9-features-with-examples#factory-methods-immutable
为了避免冗余代码和更多的可重用性,JDK9引入JavaSE9接口中的私有方法,也可以使用private关键字在接口interface中编写私有和私有静态方法。
4. ***Java 9 Module System/Jigsaw -JAVA平台模块系统***
4.1 Advantages of Java SE 9 Module System
1)As Java SE 9 is going to divide JDK, JRE, JARs etc, into smaller modules, we can use whatever modules we want. So it is very easy to scale down the Java Application to Small devices.
2) Ease of(易用) Testing and Maintainability.
3)Supports better Performance性能.
4)As public is not just public, it supports very Strong Encapsulation. (will explore it with some useful examples soon).
5)We cannot access Internal Non-Critical APIs anymore.
6)Modules can hide unwanted and internal details very safely, we can get better Security.
7)Application is too small because we can use only what ever modules we want.
8)Its easy to support Less Coupling耦合 between components.
9) Its easy to support Single Responsibility Principle (SRP/单一责任原则).
4.2 Compare JDK 8 and JDK 9
JDK 8 Folder Structure:
JDK 9 Folder Structure:
Here JDK 9 does NOT contain JRE. In JDK 9, JRE is separated into a separate distribution folder. JDK 9 software contains a new folder “jmods”. It contains a set of Java 9 Modules as shown below.
And In JDK 9 modules(95个), No rt.jar and No tools.jar. eg:
4.3 java 9 Module
构成:JDK 9 有95 个模块,我们可以使用 JDK 模块,也可以创建自己的模块,如下所示:module com.foo.bar { }
每个模块都有一个名称、相关代码和其他资源。
主要目的:支持Java中的模块化编程。
Oracle公司将JDK jars和JavaSE规范分离成两组模块,分别以”jdk.*”、“java.*”开头。"java.base"模块,称为基本模块。是一个独立模块,不依赖于任何其他模块,默认情况下,所有其他模块都依赖于此模块。
4.4 Compare Java 8 and Java 9 Applications
Java 8 application 图:
Java 9 application 图:
Java 9 applications Modules可以将一组相关包Package放入一个组中,还有一个模块描述符的新组件Modules Description。每个 Java 9 模块只有一个模块和一个模块描述符。
Java 9 模块包含以下主要组件:One Module、Module Name、Module Descriptor、Set of Packages、Set of Types and Resources。
Resources资源可以是模块信息.java(模块描述符)或任何其他属性或 XML。
4.5 Module Descriptor
元数据
语法
例子:
module blog { exports com.pluralsight.blog; requires cms; } 解释:依赖是通过 “requires” 来表示的。“exports” 语句控制着内部的哪些包是可以被其它模块访问到的。所有不被导出的包默认都封装在模块的里面。
4.6 Eclipse IDEs HelloWorld模块的开发与测试
Step By Post:https://www.journaldev.com/13630/javase9-helloworld-module-ides-part4
PS:4.1-4.5章节摘自
https://www.journaldev.com/13106/java-9-modules
https://www.journaldev.com/13596/javase9-module-basics-part2
Process API 添加了一个名为 ProcessHandle 的接口来增强 java.lang.Process 类。
ProcessHandle 接口的实例标识一个本地进程,它允许查询进程状态并管理进程。
ProcessHandle 嵌套接口 Info 来让开发者逃离时常因为要获取一个本地进程的 PID 而不得不使用本地代码的窘境。
JDK 9 已得到改进,如果已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。
7. CompletableFuture API Improvements
改进点
支持 delays 和 timeouts
public CompletableFuture completeOnTimeout(T value, long timeout, TimeUnit unit)
public CompletableFuture orTimeout(long timeout, TimeUnit unit)
钻石操作符<>可以与匿名的内部类一起使用,从而提高代码的可读性。Eg:
public class Tester {
public static void main(String[] args) {
Handler intHandler = new Handler<>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
Handler extends Number> intHandler1 = newHandler<>(2){
@Override
public void handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler> handler = new Handler<>("test") {
@Override
public void handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract class Handler {
public T content;
public Handler(T content) {
this.content = content;
}
abstract void handle();
}
JDK8基础上增加3个方法:stream()、ifPresentOrElse()、or()
参考:https://www.runoob.com/java/java9-enhanced-deprecated-annotation.html
Stream 新增了几个方法:dropWhile、takeWhile、ofNullable,为 iterate 方法新增了一个重载方法。
参考:https://www.runoob.com/java/java9-enhanced-deprecated-annotation.html
注解增加了两个新元素:since 和 forRemoval。since: 元素指定已注解的API元素已被弃用的版本。 forRemoval: 元素表示注解的 API 元素在将来的版本中被删除,应该迁移 API。
参考:https://www.runoob.com/java/java9-enhanced-deprecated-annotation.html
发布新的 HTTP 2 客户端 API,支持 HTTP/2 协议和 WebSocket 功能。它同时支持 HTTP/1.1 和 HTTP/2 协议。它同时支持同步模式(阻止模式)和异步模式。它支持使用 WebSocket API 的异步模式。
HTTP 2 Client Example demo参考:https://www.cnblogs.com/IcanFixIt/p/7229611.html
定义多分辨率图像 API,开发者可以很容易的操作和展示不同分辨率的图像了。
以下是多分辨率图像的主要操作方法:
Image getResolutionVariant(double destImageWidth, double destImageHeight) − 获取特定分辨率的图像变体-表示一张已知分辨率单位为DPI的特定尺寸大小的逻辑图像,并且这张图像是最佳的变体。。
List
demo参考:https://www.runoob.com/java/java9-multiresolution-image_api.html
PS:GC (Garbage Collector) Improvements
提高 G1 可用性、确定性和性能
统一 JVM 日志记录
删除 JDK 8 已弃用的 GC 组合
This means that the following GC combinations no longer exist:
The "foreground" mode for Concurrent Mark Sweep (CMS) has also been removed. The following command-line flags have been removed:
The command line flag -XX:+UseParNewGC no longer has an effect. ParNew can only be used with CMS and CMS requires ParNew. Thus, the -XX:+UseParNewGC flag has been deprecated and will likely be removed in a future release.
统一 GC日志记录
弃用CMS[并发标记扫描Concurrent Mark Sweep]垃圾回收器