当前位置: 首页 > news >正文

【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 CarTruck  {}

以上代码定义了一个密闭接口Service,它规定只能被Car和Truck两个类实现。


与接口类似,我们可以通过使用相同的sealed修饰符来定义密闭类:


public abstract sealed class Vehicle permits CarTruck {}

通过密闭特性,我们定义出来的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. 网络延迟时间 题目链接&#xff1a;https://leetcode.cn/problems/network-delay-time/ 使用迪杰斯特…...

MCS接口技术----定时/计数,中断

目录 一.中断系统相关寄存器 1.51单片机中断系统的总体结构&#xff1a; 2.中断源的中断级别&#xff08;由高到低&#xff09;&#xff1a; 3.与中断有关的四个寄存器&#xff1a; &#xff08;1&#xff09;TCON---定时控制寄存器 &#xff08;2&#xff09;IE---中断允…...

Java开发框架和中间件面试题(10)

目录 104.怎么保证缓存和数据库数据的一致性&#xff1f; 105.什么是缓存穿透&#xff0c;什么是缓存雪崩&#xff1f;怎么解决&#xff1f; 106.如何对数据库进行优化&#xff1f; 107.使用索引时有哪些原则&#xff1f; 108.存储过程如何进行优化&#xff1f; 109.说说…...

C++ 具名要求-基本概念-指定该类型对象可以从右值构造

指定该类型对象可以从右值构造 指定该类型的实例可以从一个右值实参构造。 要求 以下情况下&#xff0c;类型 T 满足可移动构造 (MoveConstructible) &#xff1a; 给定 T 类型的右值表达式 rv任意标识符 u 下列表达式必须合法且拥有其指定的效果 表达式后条件T u rv;u…...

Python如何把类当做字典来访问及浅谈Python类命名空间

Python如何把类当做字典来访问 Python把类当做字典来访问 定义一个类将它实例化&#xff0c;我们可以通过obj.属性来访问类的属性&#xff0c;如果想获取类的所有实例变量&#xff0c;我们可以使用obj.__dict__来访问&#xff0c;如下&#xff1a; class A:def __init__(self)…...

简述Redis备份策略以及对应的实现机制

引言 Redis作为高性能的内存数据库&#xff0c;数据的安全性至关重要。一旦数据丢失&#xff0c;可能会对业务造成重大影响。因此&#xff0c;备份Redis数据是每个Redis使用者都必须考虑的问题。本文将介绍Redis的备份策略以及对应的实现机制。 一、备份策略 1.1 定期备份 …...

【5G PHY】5G 物理层加速卡介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…...

lftp学习笔记

目录 0. ftp vs. lftp1. 安装2. 常用命令2.1 登录2.2 文件管理2.3 文件传输 3. 脚本编程4. 实践中的问题排查参考 0. ftp vs. lftp lftp是一款文件传输工具&#xff0c;支持FTP、HTTP、SFTP、FISH等多种协议。 功能ftplftp数据传输文件文件、文件夹多线程传输支持断点续传支持…...

idea 插件开发之 HelloWorld

前言 本文使用的 idea 2023.3 版本进行插件入门开发&#xff0c;首先要说明的是 idea 2023 版本及以后的 idea&#xff0c;对插件开发进行了一定程度的变动&#xff1a; 1、创建项目时不再支持 maven 选项 2、必须是 jdk17 及以后版本&#xff08;点击查看官网版本对应关系&…...

极速文件搜索工具Everything结合内网穿透实现远程搜索本地文件

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…...

【PowerMockito:编写单元测试过程中采用when打桩失效的问题】

问题描述 正如上图所示&#xff0c;采用when打桩了&#xff0c;但是&#xff0c;实际执行的时候还是返回null。 解决方案 打桩时直接用any() 但是这样可能出现一个mybatisplus的异常&#xff0c;所以在测试类中需要加入以下代码片段&#xff1a; Beforepublic void setUp() …...

[蓝桥杯 2018省赛]回家路费

回家路费 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明被不明势力劫持。后莫名其妙被扔到 X 星站再无问津。小明得知每天都有飞船飞往地球&#xff0c;但需要 108108 元的船票&#xff0c;而他却身无分文。…...

学生管理系统(vue + springboot)

学生管理系统&#xff08;vuespringboot&#xff09;资源-CSDN文库 项目介绍 这是一个采用前后端分离开发的项目&#xff0c;前端采用 Vue 开发、后端采用 Spring boot Mybatis 开发。 项目部署 ⭐️如果你有 docker 的话&#xff0c;直接 docker compose up 即可启动&#…...

算法(3)——二分查找

一、什么是二分查找 二分查找也称折半查找&#xff0c;是在一组有序(升序/降序)的数据中查找一个元素&#xff0c;它是一种效率较高的查找方法。 二、二分查找的原理 1、查找的目标数据元素必须是有序的。没有顺序的数据&#xff0c;二分法就失去意义。 2、数据元素通常是数值…...

golang实现可中断的流式下载

golang实现可中断的流式下载 最近有一个需要实现下载功能&#xff1a; 从服务器上读取文件&#xff0c;返回一个ReadCloser在用户磁盘上创建文件&#xff0c;通过io.Copy实现文件下载&#xff08;io.Copy是流式的操作&#xff0c;不会出现因文件过大而内存暴涨的问题&#xff0…...

SpringBoot 医药咨询系统

概述 智慧医药系统&#xff08;smart-medicine&#xff09;是一个基于 SpringBoot 开发的Web 项目。整体页面简约大气&#xff0c;增加了AI医生问诊功能&#xff0c;功能设计的较为简单。 开源地址 https://gitcode.net/NVG_Haru/Java_04 界面预览 功能介绍 游客功能介绍 …...

C语言转WebAssembly的全流程,及Web端调用测试

第一步&#xff1a;安装环境 参考网址&#xff1a;https://emscripten.org/docs/getting_started/downloads.html 具体过程&#xff1a; 克隆代码&#xff1a;git clone https://github.com/emscripten-core/emsdk.git进入代码目录&#xff1a;cd emsdk获取最新远端代码&…...

前端--基础 目录文件夹和根目录 VScode打开目录文件夹

目录 目录文件夹和根目录 &#xff1a; 目录文件夹 &#xff1a; 根目录 &#xff1a; VScode 打开目录文件夹 &#xff1a; VScode 打开文件夹 &#xff1a; 拖拽目录文件夹 &#xff1a; 目录文件夹和根目录 &#xff1a; 我们都清楚&#xff0c;在实际的工作中会…...

传感器原理与应用复习--超声波、微波、红外及热电偶传感器

文章目录 上一篇超声波传感器微波传感器红外传感器热电偶传感器下一篇 上一篇 传感器原理与应用复习–光电式与半导体式传感器 超声波传感器 超过2万赫兹以上的波称为超声波 压电式超声波探头常用材料是压电晶体和压电陶瓷。它是利用压电材料的压电效应来工作的。 逆压电效…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...