Java 新特性核心知识
Java 是一门"慢热型"语言。它不像 Python 那样激进引入新语法,也不像 JavaScript 那样一年一个版本。Java 的每一次版本更新,都是在向后兼容和语言进化之间小心翼翼地找平衡。
JDK 8 引入了 Lambda 和 Stream,让 Java 第一次有了函数式编程的能力。JDK 11 的 ZGC 让 GC 停顿降到亚毫秒级。JDK 21 的虚拟线程,更是 Java 并发编程诞生以来最大的一次变革。
但很多团队还在用 JDK 8,甚至 JDK 7。很多工程师知道"Lambda 是一种语法糖",但说不清楚它背后是怎么工作的。很多项目用 Stream API 写得很爽,但不知道它的惰性求值是怎么实现的。
这套内容,就是帮你把 Java 新特性的前世今生全部梳理清楚。
内容总览
Java 新特性可以分为几个阶段:
知识全景
JDK 8: 里程碑式的变革 🔴🔴
JDK 8 是 Java 历史上最重要的版本,没有之一。
Lambda 不只是语法糖。编译器把它转换成 invokedynamic 调用,由 LambdaMetafactory 在运行时生成函数式接口的实现类。理解这个过程,才能理解为什么 Lambda 里 this 指向的是外部类而不是 Lambda 本身。
Stream 的核心是惰性求值。中间操作不执行,只有遇到终端操作时才触发整个管道的计算。parallelStream() 使用 ForkJoinPool,在数据量大时可以轻松利用多核。
Stream 不是万能的。数据量小、逻辑简单的场景,用 for 循环反而更直观。Stream 的优势在于:数据处理管道清晰、易并行、可组合。但如果逻辑本身很复杂或者需要中途 break,Stream 反而不适合。
Optional 是解决 NullPointerException 的函数式方案。但它有自己的反模式——把 Optional 当字段用、在集合里放 Optional,都是误用。
新日期时间API(LocalDate/DateTimeFormatter)
java.time 是完全重新设计的日期时间 API,替代了原来糟糕的 Date 和 Calendar。LocalDate/LocalDateTime/ZonedDateTime/Instant 各有各的用途。
接口可以有实现了!这不是语言设计失误,而是 JDK 团队为了向后兼容做的艰难选择——给集合接口加 forEach() 方法时,如果不允许默认实现,所有实现类都会编译失败。
JDK 9~17: 持续进化的语法糖 🟡
Java 9 的模块系统是一把双刃剑。它为大型应用提供了结构化依赖的能力,但迁移成本极高。Tomcat、Spring 花了多年才兼容模块系统,普通项目如果不是特别需要,可以暂时跳过。
JDK 15+ 的文本块让多行字符串终于能优雅地写了。JSON、SQL、HTML 这些场景再也不需要一堆 \n 和拼接符。
JDK 16+ 的 Record 是不可变数据载体的完美方案。相比 Lombok 的 @Value,Record 是语言特性,不需要注解处理器。
JDK 17+ 的密封类让类型层次有了"有限集合"的概念。配合模式匹配,可以让编译器检查穷举性。
模式匹配是 Java 向函数式迈进的又一步。instanceof 的模式变量、switch 的模式匹配——让代码更简洁,也让编译器能做更多检查。
JDK 21: 并发革命 🔴🔴
虚拟线程是 Java 21 LTS 的最大亮点。它不是新的 API,而是一种新的线程实现——由 JVM 管理,不再绑定 OS 线程。
一个简单的理解:之前一个 OS 线程对应一个 Java 线程,现在一个 OS 线程可以承载成千上万个虚拟线程。
虚拟线程的成本极低:创建成本接近新建一个对象,上下文切换成本接近一个方法调用。这意味着你可以为每个请求创建一个虚拟线程,不用再担心线程池大小的问题。
JDK 21 的结构化并发让多线程编程更安全——线程的生命周期和作用域绑定在一起,不会出现"线程逃逸"的问题。
版本演进全景 🟡
从 JDK 8 到 JDK 21,每个版本的特性一目了然。选择用哪个版本,不仅要看新特性有多诱人,更要看生态兼容性和 LTS 版本的支持周期。
面试关联
Java 新特性和生产实践紧密相连:
- Lambda/Stream → Java 并发编程、Hadoop/Flik
- 虚拟线程 → Java 并发编程、Spring Boot 异步
- Record/密封类 → DDD 值对象、策略模式
阅读建议
记住:Java 新特性不是炫技,是解决实际问题。Lambda 让代码简洁了,但也带来了可读性挑战;虚拟线程让并发更容易了,但也带来了 ThreadLocal 的新问题。每引入一个新特性,都要理解它的设计意图和潜在代价。