Java 10 - 新特性 (APIs & Options)
Java 10 是 Java 发布节奏中的一个主要版本,于 2018 年 3 月 20 日发布。从 Java 10 开始,Oracle 将 Java 的发布节奏改为新的模式,即 6 个月的发布周期和针对 Oracle Java SE 产品的 LTS 模型。LTS 模型代表长期支持模型。
从 Java 10 开始,Oracle 每 6 个月发布一个新版本的 Java,每个版本包含一到两个主要特性。Oracle 采用发布列车概念。每个发布列车计划为 6 个月。在此时间内开发的特性将在该版本中发布,否则这些特性将被移至下一个发布列车。
Oracle JDK 与 OpenJDK
大多数 Oracle JDK 二进制文件是专有的,由 Oracle 授权并具有多种再分发限制。而 OpenJDK 则更受开发者社区欢迎。从 Java 10 开始,Oracle 决定将 OpenJDK 作为主要 JDK 以促进基于社区的 Java 开发。Oracle 将继续生产自己的 JDK,但每 3 年发布一次,并将其称为 LTS 版本。因此,OpenJDK 二进制文件将每 6 个月发布一次。
OpenJDK 对云和 container 友好,因为它可以作为 container 的一部分自由分发。因此,Oracle 推广 OpenJDK 的举措使 Java 对云或 container 开发和部署更加友好。
Java 9 和 Java 10 是非 LTS 版本。Java 11 发布是 LTS 版本。
Java 10 新特性
以下是 Java 10 中引入的主要新特性。
JEP 286 − 局部变量类型推断
JEP 322 − 基于时间的发布版本控制
JEP 304 − Garbage-Collector Interface
JEP 307 − G1 的并行 Full GC
JEP 316 − 在替代内存设备上进行堆分配
JEP 296 − 将 JDK Forest 整合到一个单一仓库
JEP 310 − Application Class-Data Sharing
JEP 314 − 额外的 Unicode 语言标签扩展
JEP 319 − Root Certificates
JEP 317 − 实验性的基于 Java 的 JIT Compiler
JEP 312 − Thread-Local Handshakes
JEP 313 − 移除 Native-Header 生成工具
Java 10 通过添加新方法和选项增强了 70 多个 APIs,并移除了已弃用的 APIs 和选项。我们将在后续章节中查看这些变化。
Java 10 - 新 APIs & Options
JDK 10 发布为 Java 库添加了 70 多个新 APIs 和选项。以下是一些重要的增强功能。
Optional.orElseThrow() 方法
java.util.Optional 类中新增了 orElseThrow() 方法,它现在是 get() 方法的首选替代方案。
创建不可变集合的 APIs
List、Set 和 Map 接口中新增了 copyOf() 方法,可以从现有集合创建新的集合实例。Collector 类新增了 toUnmodifiableList()、toUnmodifiableSet() 和 toUnmodifiableMap() 方法,用于将流中的元素收集到不可变集合中。
禁用 JRE 最后使用跟踪
引入了一个新标志 jdk.disableLastUsageTracking,用于禁用运行中 VM 的 JRE 最后使用跟踪。
Hashed Password
jmxremote.password 文件中的明文密码现在由 JMX agent 用其 SHA3-512 哈希值覆盖。
javadoc 支持多个样式表
javadoc 命令新增了一个选项 --add-stylesheet。此选项支持在生成的文档中使用多个样式表。
javadoc 支持覆盖方法
javadoc 命令新增了一个选项 --overridden-methods=value。许多类会覆盖继承的方法但不更改规范。--overridden-methods=value 选项允许将这些方法与其他继承方法分组,而不是单独再次记录它们。
javadoc 对 Summary 的支持
新增了一个内联标签 {@summary ...},用于指定用作 API 描述摘要的文本。默认情况下,API 描述的摘要是从第一句推断出来的。
示例
以下程序展示了 JAVA 10 中一些新 API 的用法。
import java.util.List;
import java.util.stream.Collectors;
public class Tester {
public static void main(String[] args) {
var ids = List.of(1, 2, 3, 4, 5);
try {
// 获取一个不可修改的 list
List<Integer> copyOfIds = List.copyOf(ids);
copyOfIds.add(6);
} catch(UnsupportedOperationException e){
System.out.println("Collection is not modifiable.");
}
try{
// 获取一个不可修改的 list
List<Integer> evenNumbers = ids.stream()
.filter(i -> i % 2 == 0)
.collect(Collectors.toUnmodifiableList());;
evenNumbers.add(6);
}catch(UnsupportedOperationException e){
System.out.println("Collection is not modifiable.");
}
}
}
输出
它将打印以下输出。
Collection is not modifiable. Collection is not modifiable.
有用链接
- Deprecation Features Options
- Removal Features Options