记录jdk17相对于jdk8增加的一下主要语法糖和新特性

jdk17 发布已经好久了,作为java的长期支持版本,引入了许多有趣且实用的新特性。这些特性不仅提高了开发效率,还增强了语言的表现力和安全性。并且是SpringBoot 3.0以后版本的硬性要求,之后势必会是java开发的主要版本。

经过我个人的测试体验,在 Java 17 环境中运行使用早期 Java 版本(如 Java 8)编写的代码和库通常是没有问题的。这里简单记录一下jdk17 相比较与jdk8的主要不同点

1. 局部变量类型推断(Java 10)

  • var 关键字:可以在局部变量声明中使用 var,而无需显式声明数据类型。Java 编译器会根据变量的初始化值推断其类型。
复制代码
  var list = new ArrayList<String>(); // 无需显式指定类型

2. Lambda 参数的局部变量语法(Java 11)

  • Lambda 表达式中的 var:允许在 Lambda 表达式的参数中使用 var,使得可以为参数添加注解。

    复制代码
    (var x, var y) -> x.process(y)

3. 文本块(Java 13,正式在 Java 15)

  • 多行字符串文字:简化了多行字符串的处理,使用三个双引号来界定。

  • 好处:简化了多行字符串的处理,特别是在处理 JSON、HTML 或 SQL 时。

复制代码
String json = """
              {
                  "name": "John",
                  "age": 30
              }
              """;

4. switch 表达式(Java 14,正式在 Java 17)

  • 扩展的 switchswitch 可以作为表达式使用,并支持 yield 语句返回值。
复制代码
     Integer day = 2;
        String result = switch (day) {
            case MONDAY, FRIDAY, SUNDAY -> "Weekend";
            case TUESDAY, THURSDAY, SATURDAY -> "Weekday";
            default -> throw new IllegalStateException("Invalid day: " + day);
        };

        System.out.println("现在是" + result);

5. 模式匹配 instanceof(Java 16)

  • 模式匹配:改进 instanceof 操作,直接在条件判断中声明变量。
复制代码
if (obj instanceof String s) {
    // 可以直接使用 s
    System.out.println(s);    
}

6. 记录类型(Java 16,正式在 Java 17)

  • record 关键字:用于声明不可变的数据对象,自动为您生成构造器、访问器、equalshashCodetoString 方法。
  • 不可变性:记录实例的状态是不可变的,一旦创建,其字段值就不能更改。
  • 数据载体:记录被设计为简单的数据载体,用于传输数据,不推荐在其中添加复杂的业务逻辑。
复制代码
//record类
public record User(String name, int age) {
}

使用Record声明的User类

复制代码
 public static void main(String[] args) {

    User user = new User("张三", 18, "北京市朝阳区");
        System.out.println(user.address());
        System.out.println(user.name());
        System.out.println(user.age());


    }

7. 密封类(Java 17)

  • 密封类:允许类或接口限制哪些其他类或接口可作为其子类或实现者(sealed, permits 关键字)。

  • 受限的继承:密封类允许您明确指定哪些其他类可以继承或实现它。

  • 保证的穷举性:密封类的一个关键优点是它们使得类型检查可以是穷尽的,特别是在使用模式匹配的 switch 表达式时。

使用方法

  1. 声明密封类:在类或接口声明中使用 sealed 关键字,然后使用 permits 关键字指定允许扩展或实现该类或接口的所有直接子类。
复制代码
public sealed class Shape permits Circle, Square, Rectangle {
    // ...
}

指定子类:子类必须选择如何继承密封类,它们可以是 final(不能被进一步继承)、sealed(指定其自己的子类)或 non-sealed(允许开放继承)。

复制代码
public final class Circle extends Shape { /*...*/ }
public sealed class Rectangle extends Shape permits FilledRectangle, EmptyRectangle { /*...*/ }
public non-sealed class Square extends Shape { /*...*/ }
相关推荐
我星期八休息3 分钟前
C++智能指针全面解析:原理、使用场景与最佳实践
java·大数据·开发语言·jvm·c++·人工智能·python
摇滚侠3 分钟前
Spring Boot 3零基础教程,WEB 开发 整合 Thymeleaf 笔记36
java·spring boot·笔记
大猫会长7 分钟前
docker安装php+apache
java·开发语言
野生技术架构师10 分钟前
JAVA 架构师面试题含答案:JVM+spring+ 分布式 + 并发编程
java·jvm·spring
瑞士卷@22 分钟前
MyBatis入门到精通(Mybatis学习笔记)
java·数据库·后端·mybatis
梵得儿SHI32 分钟前
Java 反射机制深度剖析:性能与安全性的那些坑
java·开发语言·安全·反射·动态代理·性能·反射机制
虫小宝38 分钟前
Java分布式架构下的电商返利APP技术选型与架构设计实践
java·分布式·架构
007php00741 分钟前
百度面试题解析:Zookeeper、ArrayList、生产者消费者模型及多线程(二)
java·分布式·zookeeper·云原生·职场和发展·eureka·java-zookeeper
4Forsee1 小时前
【Android】浅析 Android 的 IPC 跨进程通信机制
android·java
来旺1 小时前
互联网大厂Java面试全解析及三轮问答专项
java·数据库·spring boot·安全·缓存·微服务·面试