Java 12-13 预览特性
2026/1/15大约 3 分钟JavaJava版本特性JavaJava新特性LambdaStreamOptional模块化虚拟线程
Java 12 (2019年3月)
Switch 表达式 (预览)
// 传统 switch
int numLetters;
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numLetters = 6;
break;
case TUESDAY:
numLetters = 7;
break;
default:
numLetters = -1;
}
// Java 12 switch 表达式
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> -1;
};
// 带代码块
String result = switch (day) {
case MONDAY -> {
System.out.println("Monday!");
yield "Start of week"; // Java 13 引入 yield
}
case FRIDAY -> "End of week";
default -> "Midweek";
};字符串增强
// indent - 调整缩进
String text = "Hello\nWorld";
String indented = text.indent(4);
// " Hello\n World\n"
String dedented = indented.indent(-2);
// " Hello\n World\n"
// transform - 转换
String result = "hello"
.transform(s -> s.toUpperCase())
.transform(s -> s + "!");
// "HELLO!"Collectors.teeing
合并两个收集器的结果。
// 同时计算平均值和总数
var result = Stream.of(1, 2, 3, 4, 5)
.collect(Collectors.teeing(
Collectors.averagingInt(Integer::intValue),
Collectors.counting(),
(avg, count) -> "Average: " + avg + ", Count: " + count
));
// "Average: 3.0, Count: 5"
// 同时获取最大值和最小值
var minMax = Stream.of(1, 5, 3, 9, 2)
.collect(Collectors.teeing(
Collectors.minBy(Integer::compareTo),
Collectors.maxBy(Integer::compareTo),
(min, max) -> "Min: " + min.get() + ", Max: " + max.get()
));Files.mismatch
比较两个文件,返回第一个不匹配的位置。
Path file1 = Path.of("file1.txt");
Path file2 = Path.of("file2.txt");
long mismatch = Files.mismatch(file1, file2);
if (mismatch == -1) {
System.out.println("Files are identical");
} else {
System.out.println("First difference at position: " + mismatch);
}Compact Number Formatting
NumberFormat fmt = NumberFormat.getCompactNumberInstance(
Locale.US, NumberFormat.Style.SHORT);
System.out.println(fmt.format(1000)); // "1K"
System.out.println(fmt.format(1000000)); // "1M"
System.out.println(fmt.format(1000000000)); // "1B"
// 中文
NumberFormat cnFmt = NumberFormat.getCompactNumberInstance(
Locale.CHINA, NumberFormat.Style.SHORT);
System.out.println(cnFmt.format(10000)); // "1万"
System.out.println(cnFmt.format(100000000)); // "1亿"Shenandoah GC (实验性)
低停顿时间的垃圾回收器。
java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC MyAppG1 改进
- 可中断的混合收集
- 及时返回未使用的内存给操作系统
Java 13 (2019年9月)
文本块 (预览)
多行字符串字面量。
// 传统方式
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, World!</p>\n" +
" </body>\n" +
"</html>";
// 文本块
String html = """
<html>
<body>
<p>Hello, World!</p>
</body>
</html>
""";
// JSON
String json = """
{
"name": "John",
"age": 30,
"city": "New York"
}
""";
// SQL
String sql = """
SELECT id, name, email
FROM users
WHERE status = 'active'
ORDER BY name
""";文本块特性
// 自动去除公共前导空白
String text = """
Hello
World
""";
// 等价于 "Hello\nWorld\n"
// 行尾空白会被去除,使用 \s 保留
String text = """
Hello \s
World
""";
// 转义序列
String text = """
Line 1 \
continues here
""";
// 等价于 "Line 1 continues here\n"
// 使用 String 方法
String formatted = """
Name: %s
Age: %d
""".formatted("John", 30);Switch 表达式增强 (预览)
引入 yield 关键字。
int result = switch (day) {
case MONDAY, TUESDAY -> 1;
case WEDNESDAY -> 2;
default -> {
System.out.println("Other day");
yield 0; // 使用 yield 返回值
}
};动态 CDS 归档
自动创建类数据共享归档。
# 运行时自动创建归档
java -XX:ArchiveClassesAtExit=app.jsa -jar app.jar
# 使用归档
java -XX:SharedArchiveFile=app.jsa -jar app.jarZGC 改进
- 支持最大 16TB 堆内存
- 返回未使用内存给操作系统
Socket API 重新实现
底层实现从 C 代码迁移到 Java,更易于维护和调试。
总结
| 版本 | 主要特性 |
|---|---|
| Java 12 | Switch 表达式(预览)、字符串 indent/transform、Collectors.teeing |
| Java 13 | 文本块(预览)、yield 关键字、动态 CDS |
Java 12 和 13 主要是预览特性的引入,为后续版本的正式发布做准备。这些特性在 Java 14+ 中正式发布。
