Java 8 是 Java 历史上的里程碑版本(引入大量革命性特性),而 Java 9+ 则以 模块化 为核心,逐步优化性能、增强语法灵活性、完善工具链。以下按版本梳理核心新特性,聚焦开发中高频使用的功能:
一、Java 8(2014 年,最具革命性的版本)
Java 8 引入的特性彻底改变了 Java 编程风格,至今仍是主流生产版本,核心围绕 Lambda 表达式 和 Stream API 展开。
1. 核心语法特性
(1)Lambda 表达式(闭包)
- 简化 函数式接口(仅含一个抽象方法的接口)的实现,用
->语法替代匿名内部类,代码更简洁。 - 语法:
(参数列表) -> 表达式/代码块 - 示例:
java运行
// 替代匿名内部类(Runnable 是函数式接口) new Thread(() -> System.out.println("Lambda 简化线程")).start();// 集合排序(替代 Comparator 匿名类) List<String> list = Arrays.asList("a", "bc", "d"); list.sort((s1, s2) -> Integer.compare(s1.length(), s2.length()));
(2)函数式接口 & @FunctionalInterface 注解
- 官方提供常用函数式接口(位于
java.util.function包),避免重复定义:Predicate<T>:接收 T,返回 boolean(断言)Consumer<T>:接收 T,无返回值(消费)Function<T, R>:接收 T,返回 R(转换)Supplier<T>:无参数,返回 T(供给)
- 示例:
java运行
// Predicate 断言字符串非空 Predicate<String> isNotEmpty = s -> s != null && !s.isEmpty(); System.out.println(isNotEmpty.test("Java8")); // true
(3)方法引用(:: 语法)
- 简化 Lambda 表达式,直接引用已存在的方法(静态方法、实例方法、构造方法),语法更简洁。
- 示例:
java运行
// 引用静态方法:Integer::compare list.sort(Integer::compare);// 引用实例方法:String::length list.sort(Comparator.comparingInt(String::length));// 引用构造方法:ArrayList::new List<String> newList = list.stream().collect(Collectors.toCollection(ArrayList::new));
2. 集合 & 数据处理
(1)Stream API(java.util.stream)
- 流式处理集合 / 数组,支持 链式调用、惰性求值,简化过滤、映射、聚合等操作(类似 SQL 语法)。
- 核心操作:中间操作(
filter/map/sorted)+ 终端操作(collect/forEach/count)。 - 示例:
java运行
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6); // 过滤偶数 → 平方 → 求和 int sum = nums.stream().filter(n -> n % 2 == 0) // 中间操作(惰性).map(n -> n * n) // 中间操作(惰性).reduce(0, Integer::sum); // 终端操作(触发执行) System.out.println(sum); // 2²+4²+6²=56
(2)Optional<T>
- 解决 空指针异常(NPE),封装可能为 null 的对象,提供安全的访问方法(
isPresent/orElse/ifPresent)。 - 示例:
java运行
Optional<String> optional = Optional.ofNullable(getNullableString()); // 存在则打印,否则执行默认逻辑 optional.ifPresent(System.out::println); String result = optional.orElse("默认值");
3. 其他重要特性
- 接口默认方法(
default)和静态方法:接口可定义带实现的方法,避免修改接口时破坏实现类(如Collection.forEach())。 - Date/Time API(JSR 310):替代旧的
Date/Calendar(线程不安全、API 混乱),新 API 不可变、线程安全(LocalDate/LocalTime/Instant等)。java运行LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plusDays(1); - 重复注解(
@Repeatable):允许同一个注解在同一元素上重复使用(如@Test重复标注测试方法)。
二、Java 9(2017 年,模块化核心)
Java 9 的核心是 JPMS(Java Platform Module System,Java 平台模块系统),同时优化了 Java 8 特性,新增实用工具。
1. 核心:模块化(Module)
- 解决传统 JAR 依赖混乱、类路径(ClassPath)冗余问题,将代码和资源封装为 模块,明确依赖关系和对外暴露的 API。
- 关键文件:
module-info.java(模块描述文件),放在源代码根目录。 - 示例(模块定义):
java运行
// module-info.java module com.example.user {requires com.example.common; // 依赖其他模块exports com.example.user.service; // 对外暴露的包(其他模块可访问)provides com.example.user.api.UserApi with com.example.user.impl.UserImpl; // 服务提供 }
2. 语法 & API 增强
- 接口私有方法:接口中可定义
private方法(供默认方法调用,避免代码重复)。java运行interface MyInterface {default void doSomething() {commonLogic(); // 调用私有方法}private void commonLogic() {System.out.println("接口私有方法");} } Stream API增强:新增takeWhile()(取前缀,满足条件则停止)、dropWhile()(丢弃前缀)、ofNullable()(支持单元素 null)。java运行Stream.of(1,2,3,4,5).takeWhile(n -> n < 3).forEach(System.out::print); // 12Optional增强:新增ifPresentOrElse()(存在则执行,否则执行默认逻辑)、stream()(转为 Stream)。java运行optional.ifPresentOrElse(System.out::println,() -> System.out.println("值不存在") );
3. 工具 & 其他特性
- JShell(交互式编程工具):类似 Python 终端,支持即时执行 Java 代码(调试、学习常用)。
bash运行
jshell> int a = 10; a ==> 10 jshell> a * 2 $2 ==> 20 - 不可变集合工厂方法:
List.of()/Set.of()/Map.of(),创建不可变集合(比Collections.unmodifiableXXX更高效、简洁)。java运行List<String> immutableList = List.of("a", "b", "c"); - HTTP/2 客户端(预览):替代旧的
HttpURLConnection,支持 HTTP/2 和 WebSocket,API 更简洁(Java 11 正式转正)。
三、Java 10(2018 年,短期支持版本)
Java 10 以 局部变量类型推断 为核心,其他多为性能优化和小特性,支持周期较短(6 个月)。
核心特性:局部变量类型推断(var 关键字)
- 允许用
var替代局部变量的显式类型(编译器根据赋值推断类型),简化代码(仅支持局部变量,不支持成员变量、方法参数、返回值)。 - 示例:
java运行
var list = new ArrayList<String>(); // 推断为 List<String> var map = new HashMap<Integer, String>(); // 推断为 Map<Integer, String> var stream = list.stream(); // 推断为 Stream<String> - 限制:必须显式赋值(
var x;错误)、不能用于 lambda 参数((var x) -> x错误,Java 11 支持)。
其他特性
- GC 优化:默认启用 G1 GC(替代 Parallel GC),提升大内存应用的性能。
- 应用类数据共享(AppCDS):扩展 CDS,允许将应用类加入共享归档,缩短启动时间。
Optional新增or()方法:返回另一个Optional(区别于orElse直接返回值)。
四、Java 11+ 关键特性(高频实用)
Java 11 是 LTS(长期支持)版本,后续 LTS 为 17、21,以下聚焦开发中常用的新增特性:
1. Java 11(2018 年,LTS)
var支持 lambda 参数:解决 lambda 参数类型重复问题(配合注解使用)。java运行// Java 11 支持 Function<Integer, String> func = (var x) -> String.valueOf(x);- HTTP 客户端正式版:
java.net.http包转正,支持同步 / 异步 HTTP 请求、WebSocket。java运行HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://www.baidu.com")).GET().build(); // 同步请求 String response = client.send(request, HttpResponse.BodyHandlers.ofString()).body(); - 字符串增强方法:
isBlank()(判断空白字符串)、lines()(按行分割为 Stream)、strip()(去除首尾空白,支持全角)。java运行String str = " Java 11\n 新特性 "; str.isBlank(); // false str.lines().forEach(System.out::println); // 输出两行(去除换行符) str.strip(); // "Java 11\n 新特性"(区别于 trim():strip 支持全角空格) - 移除冗余 API:如
Thread.stop()、sun.misc.Unsafe(部分功能迁移到jdk.unsupported模块)。
2. Java 12-16(短期版本,关键特性预览)
- Java 12:
Switch表达式预览(箭头语法,直接返回值)、Collectors.teeing()(合并两个收集器结果)。 - Java 14:
Switch表达式正式版、Record 类(预览)(简化不可变数据类,自动生成equals/hashCode/toString)。java运行// Record 类(无需手动写 getter、构造方法) record User(String name, int age) {} User user = new User("Alice", 25); System.out.println(user.name()); // Alice - Java 16:Record 类正式版、密封类(Sealed Classes,正式版)(限制类的继承,避免滥用继承)。
java运行
// 密封类:仅允许指定子类继承 sealed class Shape permits Circle, Rectangle, Triangle {abstract double area(); } final class Circle extends Shape { /* ... */ }
3. Java 17(2021 年,LTS,目前主流)
Java 17 是继 8、11 后的重要 LTS 版本,合并了之前短期版本的预览特性,同时优化性能和安全性。
- 密封类(正式版):如上述示例,控制类的继承关系,增强代码可维护性。
- Record 类(正式版):广泛用于 DTO、VO 等不可变数据载体,大幅减少模板代码。
Switch表达式正式版:支持箭头语法和yield返回值,替代传统case的break。java运行int num = 2; String result = switch (num) {case 1 -> "一";case 2 -> "二";default -> "其他"; };- 移除实验性 AOT 编译和 JIT 编译器,优化 G1 GC(默认启用)。
- 增强
NullPointerException提示:明确指出哪个变量为 null,便于调试。
4. Java 18+(最新特性预览)
- Java 18:UTF-8 成为默认字符集、
Simple Web Server(轻量级 HTTP 服务器,用于测试)。 - Java 21(2023 年,LTS):
- 虚拟线程(Virtual Threads,正式版):轻量级线程(用户态线程),解决传统线程(内核态)资源占用高的问题,支持百万级并发。
java运行
// 虚拟线程示例(无需手动管理线程池) Runnable task = () -> System.out.println("虚拟线程执行"); Thread.startVirtualThread(task); // 启动虚拟线程 - 模式匹配增强(
instanceof自动转换):java运行if (obj instanceof String s) {System.out.println(s.length()); // 无需手动强转 } Record类增强:支持密封 Record、泛型 Record。
- 虚拟线程(Virtual Threads,正式版):轻量级线程(用户态线程),解决传统线程(内核态)资源占用高的问题,支持百万级并发。
五、版本选择建议
- 生产环境:优先选择 LTS 版本(8、11、17、21),稳定性和支持周期有保障:
- 若需兼容旧系统:Java 8(生态最成熟,无模块化迁移成本)。
- 若新建项目:Java 17 或 21(享受 Record、密封类、虚拟线程等新特性,性能更优)。
- 学习 / 测试:Java 21(体验最新特性,如虚拟线程、模式匹配)。
总结
Java 8 奠定了函数式编程基础(Lambda + Stream),Java 9 引入模块化解决依赖问题,Java 11+ 逐步优化语法(
var、Record)、提升性能(虚拟线程)、完善工具链。核心趋势是:简化模板代码、提升并发能力、增强类型安全性、优化性能和可维护性。