Java 新特性概览
自 Java 8 开始,Java 的发布周期加快,带来了大量旨在提高生产力、代码可读性和性能的新特性。本章将概览一些从 Java 8 到 Java 21 的重要新特性。
Java 8 (2014)
Java 8 是一次里程碑式的更新,引入了函数式编程的理念。
1. Lambda 表达式
Lambda 表达式提供了一种简洁的方式来表示匿名函数,极大地简化了事件监听器、线程等代码的编写。
// 旧方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello from old Thread!");
}
}).start();
// 使用 Lambda
new Thread(() -> System.out.println("Hello from Lambda Thread!")).start();2. Stream API
Stream API 提供了一种声明式、函数式的方式来处理集合数据。它可以让你写出更简洁、更易读的数据处理流水线,并能轻松实现并行处理。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 找出所有以 'A' 开头的名字,转为大写,并打印
names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.forEach(System.out::println);3. Optional 类
Optional 是一个容器对象,可以包含也可以不包含非 null 值。它旨在解决 NullPointerException (NPE) 问题,鼓励开发者显式地处理可能为空的情况。
4. 接口的默认方法和静态方法
接口现在可以包含具有实现的 default 方法,使得在不破坏现有实现类的情况下向接口添加新功能成为可能。
Java 10 (2018)
局部变量类型推断 (var)
使用 var 关键字,可以让编译器自动推断局部变量的类型,从而减少样板代码。
// 旧方式
Map<String, List<Integer>> myMap = new HashMap<>();
// 使用 var
var myMap = new HashMap<String, List<Integer>>();Java 11 (2018) -長期支持版本(LTS)
String 类的新方法
String 类增加了如 isBlank(), lines(), strip(), repeat() 等实用的新方法。
标准化的 HTTP Client
引入了全新的、现代的 java.net.http.HttpClient API,以替代旧的 HttpURLConnection,支持 HTTP/2 和异步操作。
Java 14 (2020)
switch 表达式
增强了 switch 语句,使其可以作为表达式返回值,并引入了更简洁的 -> 语法,无需 break。
Day day = Day.MONDAY;
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};Records (记录类)
Record 是一种特殊的类,用于创建不可变的数据载体。编译器会自动为 record 生成构造方法、equals(), hashCode(), toString() 以及所有字段的访问器方法。
// 只需一行代码
public record Point(int x, int y) {}
// 就等同于一个拥有 x, y 字段、构造器、getter、equals/hashCode/toString 的普通类
Point p = new Point(1, 2);
p.x(); // 访问器方法Java 17 (2021) - 長期支持版本(LTS)
Sealed Classes (密封类)
密封类和接口可以限制哪些其他类或接口可以继承或实现它们。这为库的设计者提供了更强的控制力,也使得 switch 的模式匹配更加强大。
// Shape 类只允许 Circle 和 Rectangle 继承
public abstract sealed class Shape permits Circle, Rectangle {
// ...
}
public final class Circle extends Shape { /*...*/ }
public final class Rectangle extends Shape { /*...*/ }
// class Triangle extends Shape {} // 编译错误!增强的模式匹配
instanceof的模式匹配: 如果instanceof判断为真,可以直接声明一个绑定变量,无需再次强转。javaObject obj = "hello"; if (obj instanceof String s) { // s 在这里可以直接作为 String 使用 System.out.println(s.toUpperCase()); }switch的模式匹配 (预览功能):switch可以直接对对象的类型进行匹配。
Java 21 (2023) - 長期支持版本(LTS)
虚拟线程 (Virtual Threads)
虚拟线程是 Project Loom 的核心成果,它是一种轻量级的线程实现,旨在显著简化高吞吐量并发应用程序的编写、维护和观察。成千上万甚至数百万的虚拟线程可以由少量的平台线程来管理,大大降低了并发编程的复杂度和资源消耗。
序列化集合 (Sequenced Collections)
引入了一系列新的接口,为集合提供统一的、定义明确的遍历顺序,并提供了访问第一个和最后一个元素的标准方法。
字符串模板 (预览功能)
提供了一种更安全、更强大的方式来构建包含运行时值的字符串,是传统字符串拼接和格式化的现代替代方案。