Skip to main content

Java 11 新特性 (EOL)

warning

生命周期结束时间(EOL): 2023/09/14

note

目前 OpenJDK 11 仍处于 LTS 状态

官方发布介绍页面:https://openjdk.org/projects/jdk/11/

1. var 用于 lambda 表达式​

在 lambda 表达式中可以使用 var 来声明参数。

List<String> list = List.of("a", "b", "c");
list.forEach((var item) -> System.out.println(item));

2. 新的字符串方法​

JDK 11 为 String 类添加了几个新方法。

// isBlank
System.out.println(" ".isBlank()); // true

// lines
String str = "Hello\nWorld";
str.lines().forEach(System.out::println);

// strip
System.out.println(" Hello ".strip()); // "Hello"

// repeat
System.out.println("Hello".repeat(3)); // "HelloHelloHello"

3. Optional 类的新方法​

Optional 类增加了 isEmpty 方法。

Optional<String> optional = Optional.empty();
System.out.println(optional.isEmpty()); // true

4. HttpClient 标准化​

新的 HttpClient API 在 JDK 11 中标准化。

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

5. 文件方法增强​

Files 类增加了几个新方法。

Path path = Paths.get("test.txt");

// writeString
Files.writeString(path, "Hello, World!");

// readString
String content = Files.readString(path);
System.out.println(content);

// isSameFile
Path path2 = Paths.get("test.txt");
System.out.println(Files.isSameFile(path, path2)); // true

6. 局部变量语法用于 lambda 表达式​

允许在 lambda 表达式中使用局部变量语法。

List<String> list = List.of("a", "b", "c");
list.forEach((var item) -> System.out.println(item));

7. 垃圾回收器改进​

引入了新的垃圾回收器 ZGC 和 Epsilon。

// 使用命令行参数来启用 ZGC
// -XX:+UseZGC

// 使用命令行参数来启用 Epsilon
// -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

8. 单文件源代码程序​

可以直接运行单文件源代码程序。

# 直接运行单文件源代码程序
java HelloWorld.java

9. Flight Recorder​

JDK 11 引入了 Flight Recorder,用于收集和分析 JVM 性能数据。

# 启用 Flight Recorder
java -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr -jar myapp.jar

10. 动态类文件常量​

引入了动态类文件常量,允许在运行时生成常量池条目。

// 示例代码无法直接展示动态类文件常量的效果

11. 移除的包和不推荐使用的功能​

对于Java EE和CORBA模块在Java 9开始就不推荐使用了。而从Java 11开始正式删除了这部分内容,所以当升级到Java 11或更高的版本的话,务必要先更急以下内容相关的代码:

移除的包:

java.xml.ws (JAX-WS)

java.xml.bind (JAXB)

java.activation (JAF)

java.xml.ws.annotation (Common Annotations)

java.corba (CORBA)

java.transaction (JTA)

java.se.ee (以上6个模块的聚合模块)

移除的工具:

wsgen and wsimport (from jdk.xml.ws)

schemagen and xjc (from jdk.xml.bind)

idlj, orbd, servertool, and tnamesrv (from java.corba)