Java17来了, 你用不用
JDK17已经来了, 你还在用JDK8吗?
随着 Java 版本的更替,JDK 8 逐步降低份额,乃至淘汰已经是时代的必然。目前的 JDK 8 和11 占有率还很高。JDK 8 发布于2014年,而2021年发行的 JDK 17,已经官宣成为了下一个长期支持版本。目前已知的是,Spring Framework 6 和 Spring Boot 3 在运行时至少需要 JDK 17。
无论你打算更新到新版本,或者观望状态,建议都对 JDK 新功能有所了解。
Lambda 表达式
//创建简单的函数式接口
Runnable runnable = () -> {
System.out.println("My Runnable");
};
Stream API
Collection接口使用 stream()和 parallelStream()方法进行了扩展,以获取用于顺序执行和并行执行的 Stream.
//串行流
Stream<Integer> sequentialStream = myList.stream();
//并行流
Stream<Integer> parallelStream = myList.parallelStream();
//过滤大于90的数字
Stream<Integer> highNums = parallelStream.filter(p -> p > 90);
//使用 forEach 遍历输出
highNums.forEach(p -> System.out.println("High Nums parallel=" + p));
串行输出时, 数据是按顺序的, 并行则不是.
Time API
解决java.util.Date和Calendar的一些问题, 提供一系列java.time的类
Clock, 对时区和毫秒的一系列支持
ZoneId, 时区静态定义
LocalTime, 仅包含时间, 定义没有时区信息的时间
LocalDate, 仅包含确切的日期
LocalDateTime, 本地日期时间
Duration, 精确到纳秒, 可以计算between两个时间的差异
Optional
进行null值判断, 可以不用显式判断
主要对JVM, 内存堆, GC等做了一系列优化
支持http2.0和websocket的API
java.net.http.HttpClient提供一系列功能
新的switch表达式, 避免传统方式漏写break导致逻辑错误, 另外可以带返回值
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
Socket的底层实现优化,引入了NIO
引入三个双引号的文本块, 类似Python的语法
String html = """
<html>
<body>
<p>"hello" world</p>
</body>
</html>
""";
instanceof类型匹配语法简化,可以直接给对象赋值
//如果obj是字符串类型则直接赋值给了str变量
if(obj instanceof String str)
record快速构造类型, 类似Lombok自动带构造器, getter, equals等等
//定义
record Boy(@SerializedName("name") String name){}
//使用
Boy boy = new Boy("Bling");
//取里面的值
boy.name();
支持隐藏类hidden 和密封类 sealed
整合14和15
官方介绍, JDK17 共有 14 个 JEP:
306:恢复始终严格的浮点语义
356:增强型伪随机数发生器
382:新的 macOS 渲染管道
391:macOS/AArch64 平台支持
398:标记删除的 Applet API
403:强封装 JDK 的内部 API
406:Switch 模式匹配(预览)
407:删除 RMI Activation
409:密封类
410:删除实验性 AOT 和 JIT 编译器
411:弃用即将删除安全管理器
412:外部函数和内存 API(孵化器)
414:Vector API(第二次进行特性孵化)
415:特定于上下文的反序列化过滤器
密封类
密封类(Sealed Classes)是 Java 15 引入的, Java 17 正式转正。
密封类可以对继承或者实现它们的类进行限制。
比如抽象类 Person 只允许 Employee 和 Manager 继承。
public abstract sealed class Person
permits Employee, Manager {
}
任何扩展密封类的类本身都必须声明为 sealed、non-sealed 或 final。
标记删除 Applet API
早期的Java AWT/Swing时代, 一种网页程序的开发方法, 类似Flash, 现已经淘汰, 当前版本标记为删除.
标记删除 RMI Activation
远程方法调用, 早期版本的功能, 当前版本标记为删除
因此看完了新版本的历程, 主要增加的功能集中在几个点上
switch的用法
instanceof的用法
sealed和permits关键字, 定义密封类
record快速构造实体
Lombda表达式
String底层从char[]调整为byte[], String增加一系列方法, 三引号用法
集合用of构造, 集合的Stream的用法
var关键字声明, 类似js
新的HttpClient
NumberFormat增加压缩数字格式, 比如将4000转成4k
NullPointerExceptions增强
Files类快速读写文件
以上内容大家可以自己编码尝试一下使用
想了解更多的小伙伴可以查阅官网 https://jdk.java.net/17/release-notes