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 { /*...*/ }

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

  1. JDK8新特性详解(一)

    虽然JDK8已经出来了N久,其新特性也在日益改变着我们的编码习惯和风格.虽然有些新特性用起来很顺手,但是总是傻傻分不清到底是哪个版本的.趁今天有时间,我们就来总结一下,JDK8有哪些能提升我们开发效率 ...

  2. JDK8到JDK17有哪些吸引人的新特性?

    作者:京东零售 刘一达 前言 2006年之后SUN公司决定将JDK进行开源,从此成立了OpenJDK组织进行JDK代码管理.任何人都可以获取该源码,并通过源码构建一个发行版发布到网络上.但是需要一个组 ...

  3. 一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)

    面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部 ...

  4. 并发设计模式和锁优化以及jdk8并发新特性

    1 设计模式 (1) 单例模式 保证一个类只能一个对象实现.正常的单例模式分为懒汉式和饿汉式,饿汉式就是把单例声明称static a=new A(),系统第一次调用的时候生成(包括调用该类的其他静态资 ...

  5. Java学习:JDK8的新特性

    Java学习:JDK8的新特性 一.十大特性 Lambda表达式 Stream函数式操作流元素集合 接口新增:默认方法与静态方法 方法引用,与Lambda表达式联合使用 引入重复注解 类型注解 最新的 ...

  6. JDK15就要来了,你却还不知道JDK8的新特性!

    微信搜「烟雨星空」,白嫖更多好文. 现在 Oracle 官方每隔半年就会出一个 JDK 新版本.按时间来算的话,这个月就要出 JDK15 了.然而,大部分公司还是在使用 JDK7 和 8 . 之前去我 ...

  7. JDK8新特性一览

    转载自:http://blog.csdn.net/qiubabin/article/details/70256683 官方新特性说明地址 Jdk8新特性.png 下面对几个常用的特性做下重点说明. 一 ...

  8. JDK8.0新特性

    连接转载地址:http://www.2cto.com/kf/201609/544044.html Eclipse: http://aiyiupload.oss-cn-beijing.aliyuncs. ...

  9. jdk8中关于操作集合的一些新特性,遍历和排序操作

    jdk8增加了不少新的东西,在集合操作这块,就有如 lamda表达式,stream,sort,optional等新的类,主要涉及遍历和排序等方面,新特性提升了不少性能,我们开发就是要拥抱新事物,守着老 ...

  10. JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序

    大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...

随机推荐

  1. Qt 生成应用程序(二)软件多图标与文件操作

    目录 关联某种文件的默认打开方式 assoc ftype 解决方案 设置文件默认图标 应用软件添加多个图标 综合方法 嘿,各位Qt桌面应用开发的同学们(应该Qt大部分应用场景就是这个吧),上一篇文章中 ...

  2. 清理MySQL的binlog日志

    前言 MySQL的binlog是以二进制形式打印的日志,没设置自动删除的话,时间长了就会占用大量存储空间.删除MySQL的binlog日志有两种方法:自动删除和手动删除. 自动删除 永久生效:修改My ...

  3. .NET5从零基础到精通:全面掌握.NET5开发技能

    C#版本新语法-官网: C#7:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7 C#8:https://docs.m ...

  4. 手写 Vuex4 源码

    本文首发于掘金,未经许可禁止转载 Vuex4 是 Vue 的状态管理工具,Vuex 和单纯的全局对象有以下两点不同: Vuex 的状态存储是响应式的 不能直接改变 store 中的状态.改变 stor ...

  5. SpringBoot项目统一处理返回值和异常

    目录 简介 前期准备 统一封装报文 统一异常处理 自定义异常信息 简介 当使用SpringBoot开发Web项目的API时,为了与前端更好地通信,通常会约定好接口的响应格式.例如,以下是一个JSON格 ...

  6. CentOS7.9中的Glibc2.17源码编译升级到Glibc2.31

    一.准备工作 1.配置yum阿里镜像源 查看yum当前配置的仓库,如果yum配置的不是阿里云源,请配置阿里云源. yum repolist all 验证是否能ping通阿里云 # 如果不能ping通可 ...

  7. Go 并发编程 - Goroutine 基础 (一)

    基础概念 进程与线程 进程是一次程序在操作系统执行的过程,需要消耗一定的CPU.时间.内存.IO等.每个进程都拥有着独立的内存空间和系统资源.进程之间的内存是不共享的.通常需要使用 IPC 机制进行数 ...

  8. JavaWeb项目开发环境搭建

    1. 安装JDK1.8 2. 安装Tomcat8 此处安装解压版apache-tomcat-8.0.47,直接将压缩包解压到指定目录即可.例如,D:\apache-tomcat-8.0.47 3. 安 ...

  9. [项目源码] JavaWeb校园宿舍管理系统

    jsp校园宿舍管理系统源码,采用Servlet+JSP+MySQL.包含数据库文件,界面采用bootstrap,简洁大方. 项目导入eclipse后的目录结构如下: 关注下面公众号,下载源码

  10. 开源.NetCore通用工具库Xmtool使用连载 - 图形验证码篇

    [Github源码] <上一篇> 介绍了Xmtool工具库中的Web操作类库,今天我们继续为大家介绍其中的图形验证码类库. 图形验证码是为了抵御恶意攻击出现的一种设计:例如用户登录.修改密 ...