Java SE 新增特性

📅 2026/7/26 14:27:10
Java SE 新增特性
Java SE 新增特性从实战角度解析关键更新Java SEStandard Edition作为Java平台的核心每个版本都会引入新特性以提升开发效率、性能与安全性。本文将从实战角度出发通过大量代码示例重点解析Java 8、Java 11、Java 17及Java 21等版本的关键新增特性。无论你是初学者还是资深开发者这些特性都能帮助你在日常开发中写出更简洁、高效的代码。## 1. Java 8Lambda表达式与Stream APIJava 8是Java历史中里程碑式的版本它引入了函数式编程风格。我们从一个实际业务场景开始过滤并转换用户列表。### 实战示例用户数据处理javaimport java.util.*;import java.util.stream.*;public class Java8Demo { public static void main(String[] args) { // 创建用户列表 ListUser users Arrays.asList( new User(Alice, 25, New York), new User(Bob, 30, London), new User(Charlie, 22, New York), new User(David, 28, Tokyo) ); // 传统方式过滤出纽约用户提取姓名并排序 ListString namesTraditional new ArrayList(); for (User user : users) { if (New York.equals(user.getCity())) { namesTraditional.add(user.getName()); } } Collections.sort(namesTraditional); System.out.println(传统方式: namesTraditional); // 使用Stream API和Lambda表达式 ListString namesStream users.stream() .filter(user - New York.equals(user.getCity())) // 过滤条件 .map(User::getName) // 提取姓名 .sorted() // 排序 .collect(Collectors.toList()); // 收集结果 System.out.println(Stream方式: namesStream); }}class User { private String name; private int age; private String city; public User(String name, int age, String city) { this.name name; this.age age; this.city city; } public String getName() { return name; } public String getCity() { return city; }}输出结果传统方式: [Alice, Charlie]Stream方式: [Alice, Charlie]解析- Lambda表达式user - New York.equals(user.getCity())替代了匿名内部类。-map(User::getName)使用方法引用简化代码。- Stream API 提供声明式数据处理减少样板代码。## 2. Java 11局部变量类型推断与HttpClientJava 11带来了局部变量类型推断var关键字和新的HttpClientAPI。我们演示一个HTTP请求示例。### 实战示例使用var和HttpClient调用APIjavaimport java.net.URI;import java.net.http.*;import java.time.Duration;public class Java11Demo { public static void main(String[] args) throws Exception { // 使用var声明变量类型由编译器推断 var url https://api.github.com/users/octocat; var client HttpClient.newHttpClient(); // 创建HTTP客户端 // 构建GET请求 var request HttpRequest.newBuilder() .uri(URI.create(url)) .timeout(Duration.ofSeconds(10)) // 设置超时 .header(Accept, application/json) .GET() .build(); // 发送请求并获取响应 var response client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(状态码: response.statusCode()); System.out.println(响应体预览: response.body().substring(0, 200)); }}输出示例状态码: 200响应体预览: {login:octocat,id:583231,node_id:MDQ6VXNlcjU4MzIzMQ,avatar_url:https://avatars.githubusercontent.com/u/583231?v4,...解析-var关键字让代码更简洁但必须保证可读性。-HttpClientAPI 支持同步和异步请求替代了老旧的HttpURLConnection。- 使用BodyHandlers.ofString()直接获取字符串响应体。## 3. Java 17密封类与模式匹配预览Java 17LTS引入了密封类增强了类型系统的可表达性。模式匹配预览则简化了类型检查。### 实战示例密封类与模式匹配java// 定义一个密封类只允许特定子类实现sealed class Shape permits Circle, Rectangle, Triangle { abstract double area();}final class Circle extends Shape { private double radius; public Circle(double radius) { this.radius radius; } public double area() { return Math.PI * radius * radius; }}final class Rectangle extends Shape { private double width, height; public Rectangle(double width, double height) { this.width width; this.height height; } public double area() { return width * height; }}// 非密封类允许继续继承non-sealed class Triangle extends Shape { private double base, height; public Triangle(double base, double height) { this.base base; this.height height; } public double area() { return 0.5 * base * height; }}public class Java17Demo { public static void main(String[] args) { Shape shape new Circle(5); // 传统方式使用instanceof强制转换 if (shape instanceof Circle) { Circle c (Circle) shape; System.out.println(传统方式: 圆形面积 c.area()); } // 使用模式匹配Java 17预览Java 21正式 if (shape instanceof Circle c) { // 直接绑定变量c System.out.println(模式匹配: 圆形面积 c.area()); } // 使用switch表达式处理所有子类 String type switch (shape) { case Circle c - 圆形面积 c.area(); case Rectangle r - 矩形面积 r.area(); case Triangle t - 三角形面积 t.area(); }; System.out.println(Switch模式匹配: type); }}输出结果传统方式: 圆形面积78.53981633974483模式匹配: 圆形面积78.53981633974483Switch模式匹配: 圆形面积78.53981633974483解析- 密封类通过permits关键字明确子类增强安全性。- 模式匹配在instanceof后直接绑定变量减少冗余代码。-switch表达式支持模式匹配确保覆盖所有子类。## 4. Java 21记录模式与虚拟线程Java 21LTS带来了记录模式正式和虚拟线程。记录模式用于解构记录record虚拟线程大幅提升并发性能。### 实战示例记录模式与虚拟线程javaimport java.time.Duration;import java.util.concurrent.*;// 定义一个记录类record Point(int x, int y) {}public class Java21Demo { public static void main(String[] args) throws Exception { // 记录模式解构记录对象 Object obj new Point(10, 20); if (obj instanceof Point(int x, int y)) { // 直接解构为x和y System.out.println(记录模式: x x , y y); } // 虚拟线程示例 var executor Executors.newVirtualThreadPerTaskExecutor(); // 创建虚拟线程执行器 var futures new CompletableFuture?[10]; for (int i 0; i 10; i) { final int taskId i; futures[i] CompletableFuture.supplyAsync(() - { try { Thread.sleep(Duration.ofSeconds(1)); // 模拟IO操作 return 任务 taskId 完成; } catch (InterruptedException e) { return 任务 taskId 被中断; } }, executor); } // 等待所有任务完成 CompletableFuture.allOf(futures).join(); for (var future : futures) { System.out.println(future.get()); } executor.shutdown(); }}输出结果记录模式: x10, y20任务0完成任务1完成...任务9完成解析- 记录模式Point(int x, int y)自动匹配记录结构无需手动调用getter。- 虚拟线程Executors.newVirtualThreadPerTaskExecutor()是轻量级线程可支持百万级并发适合IO密集型任务。## 5. 其他值得关注的特性-Java 9模块系统通过module-info.java定义模块依赖提升封装性。java module com.example.myapp { requires java.sql; exports com.example.myapp.service; }-Java 14Records预览记录类自动生成构造器、equals、hashCode等方法。java record Person(String name, int age) {}-Java 16Stream.toList()直接收集流为不可变列表。java ListString list stream.toList(); // 替代collect(Collectors.toList())## 总结Java SE的演进持续为开发者提供更简洁、更安全的工具。从Java 8的Lambda表达式和Stream API改变编程范式到Java 11的var和HttpClient提升开发便利性再到Java 17的密封类和模式匹配增强类型安全以及Java 21的虚拟线程和记录模式优化并发与数据表示每个版本都聚焦于解决实际问题。实战中建议优先采用LTS版本如Java 17和Java 21并逐步尝试预览特性。记住新特性不是银弹但合理使用能显著提升代码质量和开发效率。