记录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)
扩展的
switch:switch可以作为表达式使用,并支持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关键字:用于声明不可变的数据对象,自动为您生成构造器、访问器、equals、hashCode和toString方法。
- 不可变性:记录实例的状态是不可变的,一旦创建,其字段值就不能更改。
- 数据载体:记录被设计为简单的数据载体,用于传输数据,不推荐在其中添加复杂的业务逻辑。
//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表达式时。 使用方法
声明密封类:在类或接口声明中使用
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增加的一下主要语法糖和新特性的更多相关文章
- JDK8新特性详解(一)
虽然JDK8已经出来了N久,其新特性也在日益改变着我们的编码习惯和风格.虽然有些新特性用起来很顺手,但是总是傻傻分不清到底是哪个版本的.趁今天有时间,我们就来总结一下,JDK8有哪些能提升我们开发效率 ...
- JDK8到JDK17有哪些吸引人的新特性?
作者:京东零售 刘一达 前言 2006年之后SUN公司决定将JDK进行开源,从此成立了OpenJDK组织进行JDK代码管理.任何人都可以获取该源码,并通过源码构建一个发行版发布到网络上.但是需要一个组 ...
- 一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)
面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部 ...
- 并发设计模式和锁优化以及jdk8并发新特性
1 设计模式 (1) 单例模式 保证一个类只能一个对象实现.正常的单例模式分为懒汉式和饿汉式,饿汉式就是把单例声明称static a=new A(),系统第一次调用的时候生成(包括调用该类的其他静态资 ...
- Java学习:JDK8的新特性
Java学习:JDK8的新特性 一.十大特性 Lambda表达式 Stream函数式操作流元素集合 接口新增:默认方法与静态方法 方法引用,与Lambda表达式联合使用 引入重复注解 类型注解 最新的 ...
- JDK15就要来了,你却还不知道JDK8的新特性!
微信搜「烟雨星空」,白嫖更多好文. 现在 Oracle 官方每隔半年就会出一个 JDK 新版本.按时间来算的话,这个月就要出 JDK15 了.然而,大部分公司还是在使用 JDK7 和 8 . 之前去我 ...
- JDK8新特性一览
转载自:http://blog.csdn.net/qiubabin/article/details/70256683 官方新特性说明地址 Jdk8新特性.png 下面对几个常用的特性做下重点说明. 一 ...
- JDK8.0新特性
连接转载地址:http://www.2cto.com/kf/201609/544044.html Eclipse: http://aiyiupload.oss-cn-beijing.aliyuncs. ...
- jdk8中关于操作集合的一些新特性,遍历和排序操作
jdk8增加了不少新的东西,在集合操作这块,就有如 lamda表达式,stream,sort,optional等新的类,主要涉及遍历和排序等方面,新特性提升了不少性能,我们开发就是要拥抱新事物,守着老 ...
- JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序
大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...
随机推荐
- Cilium系列-8-绕过 IPTables 连接跟踪
系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...
- 好用工具: windows terminal
直接在微软商店搜索该软件即可,本文介绍无法使用微软商店的情况. 解题思路 当我们无法下载某个软件时,可直接去Github中寻找该项目,知道该软件资源并下载. 下载地址 https://github.c ...
- 使用 python 快速搭建http服务
python -m SimpleHTTPServer 8888 使用上面的命令可以把当前目录发布到8888端口. 直接浏览器访问 但是这条命令是当前运行的,不是后台运行的,也就是说如果Ctrl + C ...
- 三万字盘点Spring 9大核心基础功能
大家好,我是三友~~ 今天来跟大家聊一聊Spring的9大核心基础功能. 其实最近有小伙伴私信问我怎么不写文章了,催更来了 其实我不是不写,而是一直在写这篇文章,只不过令我没想到的是,从前期的选题.准 ...
- Wow: 基于 DDD、EventSourcing 的现代响应式 CQRS 架构微服务开发框架
领域驱动 | 事件驱动 | 测试驱动 | 声明式设计 | 响应式编程 | 命令查询职责分离 | 事件溯源 架构图 事件源 可观测性 OpenAPI (Spring WebFlux 集成) 自动注册 命 ...
- WPF如何构建MVVM+模块化的桌面应用
为何模块化 模块化是一种分治思想,不仅可以分离复杂的业务逻辑,还可以进行不同任务的分工.模块与模块之间相互独立,从而构建一种松耦合的应用程序,便于开发和维护. 开发技术 .Net 6 + WPF + ...
- 【问题解决】容器部署MySQL的数据在docker commit导出的镜像中丢失
问题起因 最近公司有个甲方项目参加竞赛,要求在(基于kubeflow/arena)平台上部置应用,可以将MySQL打包在应用一起,也可以分开部署,没有提供volume相关的支持.大意是可以把初始好的数 ...
- ChatGPT接入Siri(保姆级教程)
今天,我将为大家分享如何将ChatGPT应用集成到苹果手机的Siri中 (当然手机是需要魔法(TZ)的) 第一步:获取OpenAPI的Key 提取API网址:https://platform.open ...
- 如何调用api接口获取到商品数据
要调用API接口获取商品数据,需要进行以下步骤: 确定API接口 首先需要确定要使用的API接口,可以通过搜索引擎或者相关文档来查找适合的API接口.以淘宝开放平台为例,可以使用淘宝的商品信息查询AP ...
- css面试题一
1.继承 css的继承:就是给父级设置一些属性,子级继承了父级的该属性,这就是我们css中的继承.官方的解释,继承是一种规则,它允许样式不仅应用于特定的html标签元素,而且应用于其后代元素. a.有 ...