大部分团队还在用 Java 8,但 Java 已经迭代到 21 了。本文聚焦互联网后端开发最实用的 10 个新特性,每个都包含代码示例。

一、Lambda 与 Stream(Java 8)

  • 1.1 Lambda 表达式的语法与函数式接口
  • 1.2 Stream 的 map/filter/reduce 操作
  • 1.3 Collectors 常用方法
  • 1.4 并行 Stream 的适用条件

二、Optional——消灭 NullPointerException(Java 8)

  • 2.1 of() / ofNullable() / empty()
  • 2.2 map() / flatMap() / orElse() / orElseGet()
  • 2.3 orElseThrow() 的使用
  • 2.4 Optional 的误用——不要用作字段类型

三、新的日期时间 API(Java 8)

  • 3.1 LocalDate / LocalTime / LocalDateTime
  • 3.2 Instant 时间戳
  • 3.3 ZonedDateTime 时区处理
  • 3.4 DurationPeriod
  • 3.5 与旧 Date / Calendar 的对比

四、var 本地变量类型推断(Java 10)

  • 4.1 var list = new ArrayList<String>()
  • 4.2 使用限制——不能用于字段、方法参数、返回类型
  • 4.3 var 的可读性争议

五、新的 HTTP Client(Java 11)

  • 5.1 HttpClient 替代 HttpURLConnection
  • 5.2 同步与异步请求
  • 5.3 HTTP/2 支持

六、Switch 表达式(Java 14)

  • 6.1 箭头语法——case X ->
  • 6.2 yield 返回值

七、Record 类(Java 16)

  • 7.1 不可变数据载体
  • 7.2 自动生成构造器、getter、equals、hashCode、toString
  • 7.3 与 Lombok @Data 的对比

八、Sealed Classes(Java 17)

  • 8.1 限制继承的密封类
  • 8.2 与模式匹配的结合

九、模式匹配 for instanceof(Java 16)

  • 9.1 if (obj instanceof String s) 一步完成类型判断和转换
  • 9.2 与旧写法的对比

十、虚拟线程 Virtual Threads(Java 21)

  • 10.1 平台线程 vs 虚拟线程
  • 10.2 Thread.ofVirtual().start()
  • 10.3 虚拟线程如何解决阻塞式 IO 的性能问题
  • 10.4 与传统线程池的对比
  • 10.5 生产环境注意事项——不要池化虚拟线程

十一、升级建议

  • 从 Java 8 升级到 Java 17/21 的步骤
  • 常见的兼容性问题与解决方案