Java 现代化特性全景指南:从 JDK 8 到 JDK 21 的最佳实践

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 永远替代手动流关闭
  • 阻塞式并发代码可使用虚拟线程

总结:提升代码质量的关键策略

  1. 拥抱函数式:Lambda + Stream
  2. 杜绝空指针:Optional
  3. 现代日期 API:java.time
  4. 简化代码结构:var、record、文本块
  5. 强化领域模型:密封类
  6. 简化条件分支:模式匹配 + switch
  7. 革新并发编程:虚拟线程

从 JDK 8 到 21,Java 已从传统、臃肿的语言演变为现代、强劲、表达力极强的语言。熟练掌握这些特性,你的代码将更加简洁、健壮、可维护,质量自然大幅提升。


© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
小狗sayhi-的头像 - 鹿快
评论 共1条

请登录后发表评论