vlambda博客
学习文章列表

Java17来了, 你用不用



JDK17已经来了, 你还在用JDK8吗?


    随着 Java 版本的更替,JDK 8 逐步降低份额,乃至淘汰已经是时代的必然。目前的 JDK 8 和11 占有率还很高。JDK 8 发布于2014年,而2021年发行的 JDK 17,已经官宣成为了下一个长期支持版本。目前已知的是,Spring Framework 6 和 Spring Boot 3 在运行时至少需要 JDK 17。

    无论你打算更新到新版本,或者观望状态,建议都对 JDK 新功能有所了解。


JDK 8

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值判断, 可以不用显式判断

JDK9~11


    主要对JVM, 内存堆, GC等做了一系列优化

    支持http2.0和websocket的API

    java.net.http.HttpClient提供一系列功能


JDK12

    新的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);
}


JDK13


    Socket的底层实现优化,引入了NIO

    引入三个双引号的文本块, 类似Python的语法

String html = """
             <html>
                 <body>
                     <p>"hello" world</p>
                 </body>
             </html>
             """;


JDK14


    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();


JDK15


    支持隐藏类hidden 和密封类 sealed


JDK16


    整合14和15


JDK17


    官方介绍, 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

远程方法调用, 早期版本的功能, 当前版本标记为删除


17对比8的新功能总结




    因此看完了新版本的历程, 主要增加的功能集中在几个点上

  1. switch的用法

  2. instanceof的用法

  3. sealed和permits关键字, 定义密封类

  4. record快速构造实体

  5. Lombda表达式

  6. String底层从char[]调整为byte[], String增加一系列方法, 三引号用法

  7. 集合用of构造, 集合的Stream的用法

  8. var关键字声明, 类似js

  9. 新的HttpClient

  10. NumberFormat增加压缩数字格式, 比如将4000转成4k

  11. NullPointerExceptions增强

  12. Files类快速读写文件

    以上内容大家可以自己编码尝试一下使用


    想了解更多的小伙伴可以查阅官网 https://jdk.java.net/17/release-notes