【Java进阶篇】JDK新版本中的新特性都有哪些

JDK新版本中的新特性都有哪些
- ✔️经典解析
- ✔️拓展知识仓
- ✔️本地变量类型推断
- ✔️Switch 表达式
- ✔️Text Blocks
- ✔️Records
- ✔️封装类
- ✔️instanceof 模式匹配
- ✔️switch 模式匹配
- ✅✔️虚拟线程
✔️经典解析
JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等
JDK 9中推出了模块化
JDK 10中推出了本地变量类型推断
JDK 12中增加了switch表达式
JDK 13中增加了text block
JDK 14中增加了Records
JDK 14中增加了instance模式匹配
JDK 15中增加了封闭类
JDK 17中扩展了switch模式匹配
JDK 19中增加了协程
✔️拓展知识仓
✔️本地变量类型推断
在Java 10之前版本中,我们想定义定义局部变量时。我们需要在赋值的左侧提供显式类型,并在赋值的右边提供实现类型:
MyObject value = new MyObject();
在Java 10中,提供了本地变量类型推断的功能,可以通过var声明变量:
var value = new MyObject();
本地变量类型推断将引入“var”关键字,而不需要显式的规范变量的类型。
其实,所谓的本地变量类型推断,也是Java 10提供给开发者的语法糖。
关于语法糖,我前面有详细讲解到,也可以在博主的置顶文章看到,这里放个链接。 语法糖传送门。
虽然我们在代码中使用var进行了定义,但是对于虚拟机来说他是不认识这个var的,在java文件编译成class文件的过程中,会进行解糖,使用变量真正的类型来替代var。
✔️Switch 表达式
在JDK 12中引入了Switch表达式作为预览特性。并在Java 13中修改了这个特性,引入了yield语句用于返回值。
而在之后的Java 14中,这一功能正式作为标准功能提供出来。
在以前,我们想要在 switch 中返回内容,还是比较麻烦的,一般语法如下:
int i;
switch (x) {case "1":i = 1;break;case "2":i = 2;break;default:i = x.length();break;
}
在JDK13中使用以下语法:
int i = switch (x) {case "1" -> 1;case"2" -> 2;default -> {int len = args[1].length();yield len;}
};
又或者:
int i = switch (x) {case "1": yield 1;case "2": yield 2;default: {int len = args[1].length();yield len;}
};
在这之后,switch中就多了一个关键字用于跳出switch块了,那就是yield,他用于返回一个值。
和return的区别在于: return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。
✔️Text Blocks
Java 13中提供了一个Text Blocks的预览特性,并且在Java 14中提供了第二个版本的预览。
text block,文本块,是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。
我们以前从外部copy一段文本串到Java中,会被自动转义,如有一段以下字符串:
<html><body><p>Hello,world</p></body>
</html>
将其复制到Java的字符串中,会展示成以下内容:
"<htmI>\n" +
" <body>\n" +
" <p>Hello,world</p>\n" +
" <body>\n" +
"<htmI>\n";
即被自动进行了转义,这样的字符串看起来不是很直观,在JDK 13中,就可以使用以下语法了:
"""
<html><body><p>Hello,world</p></body>
</htmI>
""";
使用 """ 作为文本块的开始符合结束符,在其中就可以放置多行的字符串,不需要进行任何转义看起来就十分清爽了。
如常见的SQL语句:
String query = """SELECT `EMP_ID`,`LAST NAME` FROM `EMPLOYEE_TB`WHERE `CITY` = `INDIANAPOLIS`ORDER BY `EMP_ID`,`LAST_NAME`;""";
看起来就比较直观,清爽了。
✔️Records
Java 14 中便包含了一个新特性: EP 359: Records,
Records的目标是扩展Java语言语法,Records为声明类提供了一种紧凑的语法,用于创建一种类中是 “ 字段,只是字段,除了字段什么都没有 ” 的类。
通过对类做这样的声明,编译器可以通过自动创建所有方法并让所有字段参与 hashCode() 等方法。这是JDK 14中的一个预览特性。
使用record关键字可以定义一个记录:
record Person (String firstName,String lastName) {}
record 解决了使用类作为数据包装器的一个常见问题。纯数据类从几行代码显著地简化为一行代码。
✔️封装类
在Java 15之前,Java认为"代码重用"始终是一个终极目标,所以,一个类和接口都可以被任意的类实现或继承。
但是,在很多场景中,这样做是容易造成错误的,而且也不符合物理世界的真实规律。
例如,假设一个业务领域只适用于汽车和卡车,而不适用于摩托车。
在Java中创建Vehicle抽象类时,应该只允许Car和Truck类扩展它。
通过这种方式,我们希望确保在域内不会出现误用Vehicle抽象类的情况。
为了解决类似的问题,在Java 15中引入了一个新的特性一一密闭。
想要定义一个密闭接口,可以将sealed修饰符应用到接口的声明中。然后,permit子句指定允许实现密闭接口的类:
public sealed interface Service permits Car, Truck {}
以上代码定义了一个密闭接口Service,它规定只能被Car和Truck两个类实现。
与接口类似,我们可以通过使用相同的sealed修饰符来定义密闭类:
public abstract sealed class Vehicle permits Car, Truck {}
通过密闭特性,我们定义出来的Vehicle类只能被Car和Truck继承。
✔️instanceof 模式匹配
instanceof 是Java中的一个关键字,我们在对类型做强制转换之前,会使用instanceof 做一次判断。比如:
if (animal instanceof Cat) {Cat cat = (Cat) animal;cat .miaow();
} else if (animal instanceof Dog) {Dog dog = (Dog) animal;dog.bark();
}
Java 14带来了改进版的 instanceof 操作符,这意味着我们可以用更简洁的方式写出之前的代码例子:
if (animal instanceof Cat cat) {cat .miaow();
} else if(animal instanceof Dog dog) {dog.bark();
}
我们都不难发现这种写法大大简化了代码,省略了显式强制类型转换的过程,可读性也大大提高了。
✔️switch 模式匹配
基于 instanceof 模式匹配这个特性,我们可以使用如下方式来对对象o进行处理:
static String formatter(Object o) {String formatted = "unknown";if (o instanceof Integer i) {formatted = String.format("int %d",i);} else if (o instanceof Long l) {formatted = String.format("long %d",l);} else if (o instanceof Double d) {formatted = String.format("double %f",d);} else if (o instanceof String s) {formatted = String.format("string %s",s);}return formatted ;
}
可以看到,这里使用了很多 if-else ,其实,Java中给我们提供了一个多路比较的工具,那就是switch,而且从Java 14开始支持switch表达式,但switch的功能一直都是非常有限的。
在Java 17中,Java的工程师们扩展了switch语句和表达式,使其可以适用于任何类型,并允许case标签中不仅带有变量,还能带有模式匹配。我们就可以更清楚、更可靠地重写上述代码,例如:
static String formatterPatternSwitch(Object o) {return switch (o) {case Integer i -> String.format("int %d", i);case Long l -> String.format("long %d",l);case Double d -> String.format("double %f",d);case String s -> String.format("string %s",s);default -> o.tostring();};
}
可以看到,以上的switch处理的是一个 Object 类型,而且 case 中也不再是精确的值匹配,而是模式匹配了。
✅✔️虚拟线程
。。。。。。。。。。这块会以一个新模块细讲,大家元旦快乐!!!
相关文章:
【Java进阶篇】JDK新版本中的新特性都有哪些
JDK新版本中的新特性都有哪些 ✔️经典解析✔️拓展知识仓✔️本地变量类型推断✔️Switch 表达式✔️Text Blocks✔️Records✔️封装类✔️instanceof 模式匹配✔️switch 模式匹配 ✅✔️虚拟线程 ✔️经典解析 JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等…...
力扣labuladong一刷day49天迪杰斯特拉
力扣labuladong一刷day49天迪杰斯特拉 文章目录 力扣labuladong一刷day49天迪杰斯特拉一、743. 网络延迟时间二、1631. 最小体力消耗路径三、1514. 概率最大的路径 一、743. 网络延迟时间 题目链接:https://leetcode.cn/problems/network-delay-time/ 使用迪杰斯特…...
MCS接口技术----定时/计数,中断
目录 一.中断系统相关寄存器 1.51单片机中断系统的总体结构: 2.中断源的中断级别(由高到低): 3.与中断有关的四个寄存器: (1)TCON---定时控制寄存器 (2)IE---中断允…...
Java开发框架和中间件面试题(10)
目录 104.怎么保证缓存和数据库数据的一致性? 105.什么是缓存穿透,什么是缓存雪崩?怎么解决? 106.如何对数据库进行优化? 107.使用索引时有哪些原则? 108.存储过程如何进行优化? 109.说说…...
C++ 具名要求-基本概念-指定该类型对象可以从右值构造
指定该类型对象可以从右值构造 指定该类型的实例可以从一个右值实参构造。 要求 以下情况下,类型 T 满足可移动构造 (MoveConstructible) : 给定 T 类型的右值表达式 rv任意标识符 u 下列表达式必须合法且拥有其指定的效果 表达式后条件T u rv;u…...
Python如何把类当做字典来访问及浅谈Python类命名空间
Python如何把类当做字典来访问 Python把类当做字典来访问 定义一个类将它实例化,我们可以通过obj.属性来访问类的属性,如果想获取类的所有实例变量,我们可以使用obj.__dict__来访问,如下: class A:def __init__(self)…...
简述Redis备份策略以及对应的实现机制
引言 Redis作为高性能的内存数据库,数据的安全性至关重要。一旦数据丢失,可能会对业务造成重大影响。因此,备份Redis数据是每个Redis使用者都必须考虑的问题。本文将介绍Redis的备份策略以及对应的实现机制。 一、备份策略 1.1 定期备份 …...
【5G PHY】5G 物理层加速卡介绍
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...
lftp学习笔记
目录 0. ftp vs. lftp1. 安装2. 常用命令2.1 登录2.2 文件管理2.3 文件传输 3. 脚本编程4. 实践中的问题排查参考 0. ftp vs. lftp lftp是一款文件传输工具,支持FTP、HTTP、SFTP、FISH等多种协议。 功能ftplftp数据传输文件文件、文件夹多线程传输支持断点续传支持…...
idea 插件开发之 HelloWorld
前言 本文使用的 idea 2023.3 版本进行插件入门开发,首先要说明的是 idea 2023 版本及以后的 idea,对插件开发进行了一定程度的变动: 1、创建项目时不再支持 maven 选项 2、必须是 jdk17 及以后版本(点击查看官网版本对应关系&…...
极速文件搜索工具Everything结合内网穿透实现远程搜索本地文件
文章目录 前言1.软件安装完成后,打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库,我们需要两个软件的支持,分别是cpolar(用于搭建内网穿透数据隧道…...
【PowerMockito:编写单元测试过程中采用when打桩失效的问题】
问题描述 正如上图所示,采用when打桩了,但是,实际执行的时候还是返回null。 解决方案 打桩时直接用any() 但是这样可能出现一个mybatisplus的异常,所以在测试类中需要加入以下代码片段: Beforepublic void setUp() …...
[蓝桥杯 2018省赛]回家路费
回家路费 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明被不明势力劫持。后莫名其妙被扔到 X 星站再无问津。小明得知每天都有飞船飞往地球,但需要 108108 元的船票,而他却身无分文。…...
学生管理系统(vue + springboot)
学生管理系统(vuespringboot)资源-CSDN文库 项目介绍 这是一个采用前后端分离开发的项目,前端采用 Vue 开发、后端采用 Spring boot Mybatis 开发。 项目部署 ⭐️如果你有 docker 的话,直接 docker compose up 即可启动&#…...
算法(3)——二分查找
一、什么是二分查找 二分查找也称折半查找,是在一组有序(升序/降序)的数据中查找一个元素,它是一种效率较高的查找方法。 二、二分查找的原理 1、查找的目标数据元素必须是有序的。没有顺序的数据,二分法就失去意义。 2、数据元素通常是数值…...
golang实现可中断的流式下载
golang实现可中断的流式下载 最近有一个需要实现下载功能: 从服务器上读取文件,返回一个ReadCloser在用户磁盘上创建文件,通过io.Copy实现文件下载(io.Copy是流式的操作,不会出现因文件过大而内存暴涨的问题࿰…...
SpringBoot 医药咨询系统
概述 智慧医药系统(smart-medicine)是一个基于 SpringBoot 开发的Web 项目。整体页面简约大气,增加了AI医生问诊功能,功能设计的较为简单。 开源地址 https://gitcode.net/NVG_Haru/Java_04 界面预览 功能介绍 游客功能介绍 …...
C语言转WebAssembly的全流程,及Web端调用测试
第一步:安装环境 参考网址:https://emscripten.org/docs/getting_started/downloads.html 具体过程: 克隆代码:git clone https://github.com/emscripten-core/emsdk.git进入代码目录:cd emsdk获取最新远端代码&…...
前端--基础 目录文件夹和根目录 VScode打开目录文件夹
目录 目录文件夹和根目录 : 目录文件夹 : 根目录 : VScode 打开目录文件夹 : VScode 打开文件夹 : 拖拽目录文件夹 : 目录文件夹和根目录 : 我们都清楚,在实际的工作中会…...
传感器原理与应用复习--超声波、微波、红外及热电偶传感器
文章目录 上一篇超声波传感器微波传感器红外传感器热电偶传感器下一篇 上一篇 传感器原理与应用复习–光电式与半导体式传感器 超声波传感器 超过2万赫兹以上的波称为超声波 压电式超声波探头常用材料是压电晶体和压电陶瓷。它是利用压电材料的压电效应来工作的。 逆压电效…...
在对话中处理数学方程时,OpenClaw 的 LaTeX 渲染引擎支持哪些宏包?
在讨论OpenClaw的LaTeX渲染能力时,很多人会直接去翻官方文档或者技术手册。但如果你真的在项目里用过它,尤其是处理过那些复杂的数学对话场景,就会发现文档里写的东西和实际能用的东西,中间往往隔着一层实践的距离。 OpenClaw在设…...
深入解析Spring AI与MilvusVectorStore的集成实践
1. Spring AI与MilvusVectorStore集成概述 当我们需要处理海量非结构化数据时,传统数据库往往力不从心。想象一下你有一个装满各种文档的仓库,每次查找相关内容都需要人工翻阅——这正是向量数据库要解决的问题。Spring AI与Milvus的集成就像给这个仓库配…...
如何用AI提升视频画质?Video2X全攻略:从技术原理到实践应用
如何用AI提升视频画质?Video2X全攻略:从技术原理到实践应用 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/…...
LangChain实战:从零构建一个联网搜索增强的RAG问答系统
1. 为什么需要联网搜索增强的RAG系统 传统的RAG(检索增强生成)系统有个致命伤——它只能回答知识库里已有的内容。想象一下,你去年精心构建了一个旅游推荐系统,但今年新开的网红景点它完全不知道,因为数据没更新。这就…...
memory-lancedb-pro混合检索揭秘:向量搜索+BM25如何提升AI记忆准确率300%
memory-lancedb-pro混合检索揭秘:向量搜索BM25如何提升AI记忆准确率300% 【免费下载链接】memory-lancedb-pro Enhanced LanceDB memory plugin for OpenClaw — Hybrid Retrieval (Vector BM25), Cross-Encoder Rerank, Multi-Scope Isolation, Management CLI …...
最强AI剪辑工具盘点:免费直接用,小白秒变剪辑大师!
一、AI视频剪辑新时代:为什么选择这些工具? 2025年的AI视频工具已经不再是简单的滤镜和特效叠加,而是真正能够理解内容、自动完成剪辑全流程的智能助手。根据权威评测,真正优秀的AI剪辑工具应该具备以下特点: 真正免费…...
Uvicorn终极指南:如何快速构建高性能Python异步Web服务器
Uvicorn终极指南:如何快速构建高性能Python异步Web服务器 【免费下载链接】uvicorn An ASGI web server, for Python. 🦄 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn Uvicorn是一款专为Python设计的轻量级ASGI Web服务器…...
Phi-4-reasoning-vision-15B行业应用:银行手机银行截图→交易流程合规性审计
Phi-4-reasoning-vision-15B在银行手机银行截图合规审计中的应用实践 1. 银行业务合规审计的痛点与机遇 在银行业务数字化转型的浪潮中,手机银行已成为客户办理业务的主要渠道。然而,随之而来的是海量的交易截图和操作记录需要人工审核,以确…...
你的电动车续航打折了?可能是AMT换挡逻辑没调好!聊聊经济性换挡那些事儿
你的电动车续航打折了?可能是AMT换挡逻辑没调好!聊聊经济性换挡那些事儿 最近在车主群里经常看到这样的抱怨:"明明官方标称续航500公里,怎么我开起来连400都跑不到?"作为一位开了三年电动车的"老司机&q…...
vLLM-v0.17.1与卷积神经网络(CNN)结合:多模态理解新思路
vLLM-v0.17.1与卷积神经网络(CNN)结合:多模态理解新思路 1. 多模态AI的行业痛点与解决方案 计算机视觉和自然语言处理长期作为AI两大独立分支发展,但在实际业务场景中,图像与文本的协同理解需求日益凸显。传统方案通…...
