01 引言
JDK自从被Oracle收购以后,那升级的速度和手机更新换代一样快,2025 年 3 月 18 日不是才发布了JDK24么。这速度真的是让开发者来不及追赶,上一个版本还没有完全弄明白,下一个版本就已经发布了。
我们在开发中都会使用稳定版本(LTS),最经典的当属JDK7。很多项目都是基于JDK7开发的,随后的稳定版本分别有JDK8(2014)、JDK11(2018)、JDK17(2021)、JDK21(2023)。
笔者入行就使用JDK7,被告知JDK7是最稳定的,当时JDK8还不稳定,不建议使用。然后随着JDK8中lambda表达式、Stream 流式编程 API、Optional等被广泛使用,很多企业慢慢升级JDK8。JDK8也就作为受欢迎的版本。因为JDK8的广泛使用,IT圈流行着这样一句话:它发由它发,我用 JDK 8。
02 JDK升级
对于学习 Java 的开发者来说,选择一个稳定的版本至关重要。JDK的稳定版本有那么多,要不要升级呢?升级的话,要升级哪个版本呢?
JDK的升级不能步子迈的太大,由于JDK9、JDK11分别对部分模块进行了重构,所以盲目升级会导致导入的包丢失或者类找不到。所以JDK的升级需要对项目的引入进行评估。
JDK的其他版本本次不做详细介绍,笔者建议至少升级到JDK17。
03 JDK8到17新增的功能
3.1 集合工厂方法(JDK9)
List.of()
, Set.of()
, Map.of()
等快速创建不可变集合。
List<Integer> list = List.of(1, 2, 3, 4, 1);
System.out.println(list);
3.2 改进 Stream API(JDK9)
新增 takeWhile()
, dropWhile()
等方法
@Test
void testJDK9And10() {
List<Integer> list = List.of(1, 2, 3, 4, 1);
System.out.println(list);
System.out.println("--------------------------------------");
// [1, 2, 3]
// 从头开始获取,直到找到第一个不匹配的元素,返回之前的数据
list.stream().takeWhile(itme -> itme < 3).forEach(System.out::println);
// 1,2
System.out.println("--------------------------------------");
// 从头开始去除满足条件的数据,从不满足的条件的的数据开始遍历数据
list.stream().dropWhile(itme -> itme < 3).forEach(System.out::println);
// 3,4,1
}
3.3 局部变量类型推断(JDK10)
var
变量最开始用在js
中,后来用在scala
中,现在java
也支持了
var list = new ArrayList<String>();
3.4 HTTP Client API(JDK11)
支持同步/异步 HTTP 请求(取代 HttpURLConnection
)。
- 传统HttpURLConnection:自JDK 1.1引入,API设计陈旧,仅支持HTTP/1.1,同步阻塞模型,使用复杂 。
- Apache HttpClient:功能丰富的第三方库,支持HTTP/1.1和HTTPS,提供连接池管理等高级特性 。
- Java 11 HttpClient:Java 9引入孵化模块,Java 11正式发布,支持HTTP/2和WebSocket,提供同步/异步双模型。
@Test
void testJDK11() throws IOException, InterruptedException {
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com"))
.build();
HttpResponse<String> send = httpClient.send(request, BodyHandlers.ofString());
System.out.println(send.body());
String str = "test hello";
String repeat = str.repeat(2).strip();
if (!repeat.isBlank()) {
System.out.println(repeat);
// test hellotest hello
}
}
3.5 文本块(JDK13)
支持多行字符串("""..."""
),简化 JSON/HTML 编写。这个也是scala
中也是支持的.
@Test
void testJDK13() {
String a = """
12121
1245
""";
System.out.println(a);
}
3.6 Switch 表达式(JDK15)
Switch 表达式
@Test
void testJDK15() {
var str = RandomUtil.randomInt(5);
System.out.println(str);
switch (str) {
case 1 -> System.out.println("1");
case 2 -> System.out.println("2");
case 3 -> System.out.println("3");
default -> System.out.println("default");
}
}
3.7 instanceof 模式匹配(JDK16)
不再需要手动强制转化了
@Test
void testJDK16() {
Object a = "hello";
if (a instanceof String astr) {
System.out.println(astr.length());
// 5
}
}
04 框架的最低要求
SpringBoot
SpringBoot3.x
最新稳定版为3.0.13
,最低要求JDK17
。
JDK要求:
Spring AI
最低要求是Spring Boot 3.x
,也就要求JDK最低也就是JDK17
。
Nacos 3.x
Nacos 3.x稳定版于2025-04-25发布,最低要求JDK17
。
Nacos 3.x
集注册中心、配置中心于一体,有新增了AI相关的MCP的支持。
05 小结
JDK从8到17,其中优化了很对语法,对开发者非常方便。笔者最喜欢文本块和集合工厂。除了语法,性能方面也提升不少。
越来越多的框架也纷纷最低支持JDK17,要想使用新的框架,就需要使用JDK17。升级JDK8到17,给了这么些理由,够不够呢?