Java 8 到 Java 17 主要新特性
Java 8 到 Java 17 是 Java 语言的多个重要版本,其中每个版本都引入了新的特性和改进。下面是 Java 8 到 Java 17 中主要的新特性概览。
Java 8 新特性
1. Lambda 表达式
Lambda 表达式是 Java 8 的一个重要特性,它使得 Java 支持函数式编程,可以以更加简洁的方式表示匿名函数。
// 传统方式
new Thread(new Runnable() {
public void run() {
System.out.println("Hello from thread");
}
}).start();
// Lambda 表达式方式
new Thread(() -> System.out.println("Hello from thread")).start();
2. Stream API
Stream API 提供了高效的、可组合的数据处理方式,可以简化集合的操作,比如过滤、映射、排序等。
List<String> list = Arrays.asList("a", "b", "c", "d");
list.stream()
.filter(s -> s.equals("b"))
.forEach(System.out::println);
3. 接口默认方法和静态方法
接口可以有默认方法(default
)和静态方法,这意味着接口可以提供方法的实现,而不必依赖于实现类。
interface MyInterface {
default void print() {
System.out.println("Default Method");
}
static void staticPrint() {
System.out.println("Static Method");
}
}
4. Optional 类
Optional
类用来避免空指针异常(NullPointerException
),通过容器封装可能为空的值。
Optional<String> name = Optional.ofNullable("John");
name.ifPresent(n -> System.out.println(n.length())); // 计算字符串长度
5. 新的日期时间 API (java.time)
Java 8 引入了全新的日期和时间 API,提供了更强大、更容易使用的日期时间操作方法。
LocalDate date = LocalDate.now();
LocalDate dateOfBirth = LocalDate.of(1990, 12, 15);
System.out.println(dateOfBirth.getDayOfWeek()); // SATURDAY
6. 方法引用和构造器引用
方法引用和构造器引用使得 Lambda 表达式更加简洁。
// 方法引用
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);
// 构造器引用
List<String> names2 = Arrays.asList("Alice", "Bob", "Charlie");
names2.stream().map(String::new).forEach(System.out::println);
Java 9 新特性
1. 模块化系统 (Jigsaw)
Java 9 引入了模块系统(Jigsaw),允许开发者将大型应用程序拆分成多个模块,提高可维护性和性能。
module com.example.myapp {
requires java.base;
exports com.example.myapp.util;
}
2. JShell (交互式 Shell)
JShell 是 Java 提供的交互式命令行工具,可以快速测试代码片段,不需要编写完整的类和方法。
jshell> String message = "Hello, World!"
jshell> System.out.println(message)
3. 私有接口方法
Java 9 允许在接口中定义私有方法,用来简化代码和避免重复的实现。
interface MyInterface {
private void privateMethod() {
System.out.println("Private method");
}
}
4. 集合工厂方法
Java 9 引入了集合工厂方法,使得创建集合变得更加简洁。
List<String> list = List.of("a", "b", "c");
Set<String> set = Set.of("a", "b", "c");
Map<String, String> map = Map.of("key1", "value1", "key2", "value2");
Java 10 新特性
1. 局部变量类型推断 (var)
Java 10 引入了 var
关键字,允许局部变量在声明时推断类型,简化代码。
var list = new ArrayList<String>(); // 编译器会推断出类型为 ArrayList<String>
2. 垃圾回收改进
Java 10 提供了 JEP 307(Parallel Full GC)的改进,增加了对垃圾回收性能的优化,特别是在多核机器上的表现更佳。
3. JDK Docker 支持
Java 10 增强了对 Docker 容器的支持,使得在容器环境中运行 Java 程序更加高效。
Java 11 新特性
1. 字符串 API 增强
Java 11 增强了对字符串的操作方法,如 isBlank()
, lines()
, strip()
等。
String str = " Hello Java ";
System.out.println(str.strip()); // "Hello Java"
2. 新的 HTTP Client API
Java 11 引入了新的 HTTP Client API,用于替代旧的 HttpURLConnection
,更现代和功能强大。
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
3. 异常处理的改进
Java 11 引入了 var
支持的多行异常处理语法,简化了异常处理。
try (var reader = Files.newBufferedReader(Path.of("file.txt"))) {
// 操作文件
}
Java 12 新特性
1. Shenandoah 垃圾回收器
Java 12 引入了 Shenandoah 垃圾回收器,它是一种低延迟的垃圾回收器,旨在减少 GC 暂停时间。
2. Switch 表达式(预览)
Java 12 引入了 switch
表达式(预览特性),增强了 switch
语法,使其支持返回值。
int dayOfWeek = 3;
String dayType = switch (dayOfWeek) {
case 1 -> "Monday";
case 2 -> "Tuesday";
case 3 -> "Wednesday";
default -> "Unknown";
};
Java 13 新特性
1. 文本块(预览)
文本块使得多行字符串变得更加简洁,避免了长时间的转义字符。
String json = """
{
"name": "John",
"age": 30
}
""";
2. 动态 CDS 归档
Java 13 允许将类的元数据存档并重用,减少启动时间,提高性能。
Java 14 新特性
1. 记录类(预览)
记录类(record
)简化了不可变数据对象的创建。
record Point(int x, int y) {}
Point p = new Point(1, 2);
2. NullPointerException 改进
Java 14 引入了更详细的 NullPointerException
错误信息,指出具体的变量是哪一部分为 null
。
Java 15 新特性
1. 隐式类型转换的增强(JEP 367)
Java 15 引入了对隐藏类型转换的支持,使得代码更简洁。
Java 16 新特性
1. JEP 396: 强封装 JDK 内部 API
Java 16 提高了 JDK 内部 API 的封装,使得开发者不容易访问到内部 API。
Java 17 新特性
1. 密封类(Sealed Classes)
密封类允许开发者指定哪些类可以继承某个类,增强了类的设计安全性。
sealed class Shape permits Circle, Rectangle {}
final class Circle extends Shape {}
final class Rectangle extends Shape {}
2. JEP 356: 强化对 macOS ARM 架构的支持
Java 17 增强了对 macOS ARM 架构的支持,特别是在 Apple Silicon 上的优化。
3. JEP 382: 新的 JDK 发行方式
Java 17 引入了长期支持(LTS)版本,并更新了 JDK 的发布机制,以更好地支持用户。
总结
从 Java 8 到 Java 17,每个版本都带来了新的特性和改进,特别是在 函数式编程、性能优化 和 新 API 方面。Lambda 表达式、Stream API、模块系统、var
关键字等特性,使得 Java 成为更加灵活、现代化的编程语言。随着每个版本的发布,Java 越来越适应现代开发需求,并不断增强对开发者的支持。