JDK8到JDK17最常用的核心功能
从 JDK 8 到 JDK 17,Java 引入了许多提升开发效率和代码质量的新特性。以下是 最常用且实用的核心功能,附代码示例说明:
1. 局部变量类型推断 (JDK 10)
用途:简化局部变量声明,无需重复写类型
示例:
// JDK 8
List<String> list = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();// JDK 10+
var list = new ArrayList<String>(); // 自动推断为 List<String>
var map = new HashMap<String, Integer>();
2. 文本块 (JDK 15)
用途:简化多行字符串(如 JSON/HTML/SQL)的书写
示例:
// JDK 8
String json = "{\n" +" \"name\": \"Java\",\n" +" \"version\": 17\n" +"}";// JDK 15+
String json = """{"name": "Java","version": 17}"""; // 自动处理换行和缩进
3. 记录类 (Record, JDK 16)
用途:快速定义不可变的数据传输对象(DTO)
示例:
// JDK 8
public class Person {private final String name;private final int age;// 需要手动编写构造方法、getter、equals、hashCode、toString...
}// JDK 16+
public record Person(String name, int age) {} // 自动生成全部方法
4. 模式匹配 (JDK 16/17)
用途:简化 instanceof
检查和类型转换
示例:
// JDK 8
if (obj instanceof String) {String s = (String) obj;System.out.println(s.length());
}// JDK 16+
if (obj instanceof String s) { // 直接绑定变量 sSystem.out.println(s.length());
}
5. Switch 表达式 (JDK 14)
用途:更简洁的 switch
语法,支持返回值
示例:
// JDK 8
int result;
switch (day) {case MONDAY: result = 1; break;case TUESDAY: result = 2; break;default: result = 0;
}// JDK 14+
int result = switch (day) {case MONDAY -> 1;case TUESDAY -> 2;default -> 0;
}; // 类似 Lambda 的箭头语法
6. HTTP Client (JDK 11)
用途:替代 HttpURLConnection
,支持 HTTP/2 和异步请求
示例:
// JDK 11+
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://api.example.com")).build();// 同步请求
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());// 异步请求
client.sendAsync(request, BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println);
7. Stream API 增强 (JDK 9~16)
常用方法:
// JDK 9+: takeWhile/dropWhile(条件过滤)
List<Integer> list = List.of(1, 2, 3, 4, 5);
List<Integer> result = list.stream().takeWhile(n -> n < 4) // 取到第一个不符合条件的元素为止.toList(); // [1, 2, 3]// JDK 16+: toList() 简化
List<String> filtered = stream.filter(s -> s.startsWith("A")).toList();
8. Optional 增强 (JDK 9~11)
示例:
// JDK 11+: 空 Optional 时执行代码
Optional<String> opt = Optional.empty();
opt.ifPresentOrElse(s -> System.out.println(s),() -> System.out.println("Not found")
);// JDK 9+: 链式调用
Optional<String> result = Optional.of("value").stream().filter(s -> s.length() > 2).findFirst();
9. 垃圾收集器升级
- ZGC (JDK 15):亚毫秒级暂停,适合大内存应用
启动参数:-XX:+UseZGC
- Shenandoah (JDK 12):低延迟垃圾收集器
启动参数:-XX:+UseShenandoahGC
10. 密封类 (Sealed Classes, JDK 17)
用途:限制类的继承关系,增强类型安全
示例:
// 定义密封接口
public sealed interface Shape permits Circle, Rectangle {}// 子类必须明确继承权限
public final class Circle implements Shape {}
public final class Rectangle implements Shape {}
迁移建议
-
优先使用的特性:
- 文本块(处理多行字符串)
- 记录类(替代 Lombok @Data)
- 局部变量类型推断(简化代码)
- 模式匹配(减少类型转换)
-
工具支持:
- 使用
jdeprscan
检查废弃 API - 升级构建工具(Maven/Gradle)到最新版
- 使用
-
逐步升级:
先升级到 JDK 11(LTS),再过渡到 JDK 17。
这些特性显著提升了代码可读性和维护性,建议从常用功能(如文本块、记录类)开始实践,逐步深入高级特性。