新特性速览:别停在 Java 8
很多老教程还停在 Java 8(2014 年)。其实 JDK 21/25 加了一大批让代码更短、更安全的特性。下面挑五个最实用的过一遍,看到老同事写新式代码不至于懵。
| 特性 | 正式版 | 一句话价值 |
|---|---|---|
| record | 16 | 一行定义不可变数据类,第 3 章已讲。 |
| sealed 密封类 | 17 | 规定"我这个父类只允许哪几个子类继承",防止乱扩展。 |
| instanceof 模式匹配 | 16 | 判类型的同时直接强转好,不用再 (Animal) a。 |
| switch 模式匹配 | 21 | switch 里直接按类型、按值解构,配 sealed 类天下无敌。 |
| 文本块 text block | 15 | 三引号写多行字符串,SQL、JSON 终于不用拼了。 |
sealed + 模式匹配,现代 Java 的组合拳
// sealed:Shape 只允许 Circle / Square / Triangle 三种子类
public sealed interface Shape
permits Circle, Square, Triangle {}
record Circle(double r) implements Shape {}
record Square(double side) implements Shape {}
record Triangle(double a, double b, double c) implements Shape {}
// switch 模式匹配:按类型匹配,还能直接取出 record 组件
static double area(Shape s) {
return switch (s) {
case Circle(double r) -> Math.PI * r * r;
case Square(double side) -> side * side;
case Triangle(var a, var b, var c) -> 0; // 海伦公式略
};
}
// 文本块:三引号包多行,写 SQL/JSON 再也不用 + \n
String sql = """
SELECT id, name, score
FROM students
WHERE score > ?
ORDER BY score DESC
""";
接口默认方法与方法引用:Java 8 的两大功臣
Java 8 之前,接口里只能有抽象方法,一旦加新方法,所有实现类都得跟着改。默认方法(default)允许接口给个默认实现,老实现类不改动也能跑。再配上方法引用,代码短得不像话。
// 默认方法:接口里给个现成实现,实现类不用重写也能用
interface Greetable {
void greet(String name); // 抽象方法,必须实现
default void greetWorld() { // 默认方法,有现成实现
System.out.println("Hello, world!");
}
static Greetable silent() { // 接口里还能有静态方法
return name -> {};
}
}
// 方法引用:把已有的现成方法,当 Lambda 传进去
// System.out::println 就是 (x) -> System.out.println(x) 的简写
List<String> names = List.of("a", "b", "c");
names.forEach(System.out::println); // 方法引用:类::实例方法
// 四种方法引用常见写法
list.stream().map(String::toUpperCase) // 实例方法引用
.sorted(String::compareTo) // 静态/实例方法引用
.collect(Collectors.toList());
Supplier<Student> s1 = Student::new; // 构造器引用:new Student() 当 Supplier
论什么时候用方法引用
当 Lambda 体里只是调用一个现成方法、参数正好透传时,就换成方法引用,比如 x -> System.out.println(x) 写成 System.out::println。逻辑一旦超过一行(要算点东西、调两个方法),就别硬套,老老实实写 Lambda 体。
团队如果还在 JDK 8 维护老系统,别上来就把 record、sealed 全堆上去——编译不过事小,队友看不懂事大。新特性是"写新代码时更顺手",不是"把老代码全部重写"。新项目直接上 21,老项目稳定第一。
1.(新特性题)record 在哪个版本正式?它和 Lombok 的 @Data 什么关系?
查看答案
答案:JDK 16 正式。record 是语言级原生数据类,编译器生成构造器、访问器、equals/hashCode/toString。Lombok @Data 是注解处理器在编译期生成代码,record 更轻量、不可变、无第三方依赖。
2.(新特性题)sealed 类解决什么问题?
查看答案
答案:JDK 17 正式。规定父类只允许哪些子类继承(permits),防止随意扩展。配 switch 模式匹配,编译器能保证覆盖所有分支。
3.(代码题)文本块三引号从哪个版本开始?写 SQL 有什么好处?
查看答案
答案:JDK 15 正式。多行字符串不用拼 + \n,SQL/JSON 直接三引号包,可读性大幅提升。