Java 现代化特性全景指南:从 JDK 8 到 JDK 21 的最佳实践
深入对比旧写法与现代特性,让你直观感受 Java 代码的简洁、清晰与强劲。涵盖 LTS 版本(8、11、17、21)及部分重大非 LTS 版本(9、10、14、15、19)的实用特性。
JDK 8 (LTS) – 函数式编程革命
1. Lambda 表达式
// 旧写法
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) { return s1.compareTo(s2); }
});
// 新写法
list.sort(String::compareTo);
提升质量:代码简洁,行为参数化更自然。
2. Stream API
List<String> result = names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.collect(Collectors.toList());
提升质量:声明式集合操作,可并行化,更易读。
3. Optional
String result = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCountry)
.map(Country::getIsocode)
.map(String::toUpperCase)
.orElse("DEFAULT");
提升质量:明确表达可能无值,避免 NullPointerException。
4. 新日期时间 API
LocalDate tomorrow = LocalDate.now().plusDays(1);
String formattedDate = tomorrow.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
提升质量:不可变、线程安全,API 清晰直观。
5. 接口默认方法和静态方法
public interface MyInterface {
default void newDefaultMethod() { System.out.println("Default"); }
static MyInterface getInstance() { return new MyInterfaceImpl(); }
}
提升质量:接口演进更安全,可组织工具方法。
JDK 9 – 模块化(Jigsaw)
module com.example.app {
requires java.sql;
exports com.example.app.api;
}
提升质量:
- 控制模块可见性
- 减少类冲突
- 提高大型项目可维护性
JDK 10 – var 局部变量类型推断
var list = new ArrayList<String>();
提升质量:减少冗长类型声明,保持类型安全。
JDK 11 (LTS) – 稳定与优化
1. HTTP Client
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
提升质量:现代 HTTP API,替代冗长的 HttpURLConnection。
2. String 增强方法
" Java ".strip(); // "Java"
"Hello
World".lines(); // Stream<String>
"Java".repeat(3); // "JavaJavaJava"
提升质量:减少第三方库依赖,操作字符串更便捷。
3. Files.readString / writeString
String content = Files.readString(Path.of("test.txt"));
Files.writeString(Path.of("out.txt"), "Hello World!");
提升质量:一行代码完成文件读写,简化 IO。
4. var 用于 Lambda 参数
BiFunction<String, String, String> func = (@NotNull var s1, @Nullable var s2) -> s1 + s2;
提升质量:可添加注解,提升一致性和可读性。
JDK 14 – Switch 表达式 & 文本块
// Switch 表达式
String result = switch(day) {
case MONDAY, FRIDAY -> "Work";
case SATURDAY, SUNDAY -> "Relax";
default -> "Unknown";
};
// 文本块
String json = """
{
"name": "Alice",
"age": 25
}
""";
提升质量:简化多条件分支,处理多行字符串更直观。
JDK 15 – Records(正式预览)
record User(String name, int age) {}
User u = new User("Alice", 25);
提升质量:减少样板代码,自动生成 equals/hashCode/toString。
JDK 17 (LTS) – 现代 Java 基石
1. 密封类
public sealed interface Shape permits Circle, Rectangle {}
public final class Circle implements Shape {}
public non-sealed class Rectangle implements Shape {}
提升质量:限制类层次结构,强化领域模型,安全性更高。
2. 模式匹配 for instanceof
if (obj instanceof String s) {
System.out.println(s.toUpperCase());
}
提升质量:消除冗余类型转换,简化类型检查。
JDK 19 – 虚拟线程预览
- 高并发 I/O 场景,轻量线程
- 阻塞式编程即可实现高吞吐量
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> Thread.sleep(1000));
}
提升质量:简化异步编程,性能提升明显。
JDK 21 (LTS) – 并发与模式匹配新时代
1. 虚拟线程(正式)
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 100_000).forEach(i -> executor.submit(() -> Thread.sleep(1000)));
}
2. Record Patterns
record Point(int x, int y) {}
if (obj instanceof Point(int x, int y)) { System.out.println(x + y); }
3. Switch 模式匹配
return switch (obj) {
case Integer i -> "int " + i;
case String s -> "String " + s;
case null -> "Null";
default -> obj.toString();
};
提升质量:条件分支更清晰,结合模式匹配和守卫条件可处理复杂逻辑。
实用小技巧
- Optional.isEmpty() (JDK 11+)
- Predicate.not() (JDK 11+)
- Stream.toList() (JDK 17+)
- String.indent() (JDK 12+)
- try-with-resources 永远替代手动流关闭
- 阻塞式并发代码可使用虚拟线程
总结:提升代码质量的关键策略
- 拥抱函数式:Lambda + Stream
- 杜绝空指针:Optional
- 现代日期 API:java.time
- 简化代码结构:var、record、文本块
- 强化领域模型:密封类
- 简化条件分支:模式匹配 + switch
- 革新并发编程:虚拟线程
从 JDK 8 到 21,Java 已从传统、臃肿的语言演变为现代、强劲、表达力极强的语言。熟练掌握这些特性,你的代码将更加简洁、健壮、可维护,质量自然大幅提升。
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END
- 最新
- 最热
只看作者