Java8->Java19的初步探索

导读

最近网上开始了大量的关于Java19的讨论,我也想着用了Java8这么久该接受一点新的东西了,于是便开始研究了起来

Java 19

Java19是一个免费版本。下面是JDK19的支持图

image.png

(来源: https://www.bilibili.com/video/BV1V84y1B7dD?t=39.9)
可以看到目前较为长期的免费支持版本是Java17,而下一个版本是Java21(免费支持于2027年结束)

开始研究

在网上查找了大量的文件并对JDK9-19做了些整理打算从以下几个功能去了解从Java8-Java19的发展

  1. 数组转列表和列表转数组(Java 9)
  2. var关键字(Java 10)
  3. yield关键字(Java 13)
  4. Record(记录)类(Java 14)
  5. case的多个值匹配(Java 14)
  6. case返回值(Java 14,17)
  7. Sealed(密闭)类(Java 15)
  8. switch类型判断(Java 17)
  9. 文本块(Java 17)
  10. switch复杂表达式(Java 19 第三次预览(正式版Java 19该功能被移除,不排除以后会加入的可能))

数组转列表和列表转数组(Java 9)

@Testpublic void test(){String[] strings={"你好","早","这foe及","vdsoijfdois"};List<String> stringList=List.of(strings);//JDK9System.out.println(stringList);}

List.of为JDK9带来的新功能,他可以将数组转换为对应的列表(List),但是,转换后的List是不能改变的。

var关键字(Java 10)

var关键字可以不用显式地声明变量的类型。举例:

public class People{private String name;private int age;//Getter Setter...
}
public static void main(String[] args){var people=new Student();people.setSid("321321");//...
}

虽说不会显示地声明类型,但实际上,变量的类型是确定的,因为:

  1. 使用var声明的变量必须被初始化
  2. 初始化时是什么类型以后再赋值时必须是这个类型或者这个类的子类

yield关键字(Java 13)

yield目前貌似只适用于case分支中,举例:

@Testpublic void returedSwitch2(){Scanner scanner=new Scanner(System.in);int i = scanner.nextInt();int result=switch (i){case 1->{System.out.printf("输入的是%d",i);yield i+3;}case 2->{System.out.printf("输入的是%d呀",i);yield i-5;}default -> i;};System.out.printf("result=%d",result);}

它的作用是将case分支中yield后面的值作为返回值返回回来。如果要使用yield关键字或者想让switch返回一个值则case后面的:必须被替换为->
->这个符号在switch中的应用是Java 12带来的,它的作用是让case的执行唯一,直白说就是不会再“逢break停”。
举个例子:

Scanner scanner=new Scanner(System.in);String next = scanner.next();//part 1String response=switch (next){case "你好","早上好","中午好","下午好"->"你好呀";case "我不是很好","我不好","我难受"->"不要伤心嘛";default -> "需要帮助吗?";};System.out.println(response);System.out.println("与上面的对比");//part 2switch (next){case "你好","早上好","中午好","下午好":System.out.println("你好呀");case "我不是很好","我不好","我难受":System.out.println("不要伤心嘛");break;default :System.out.println("需要帮助吗?") ;break;};

part 1就是新的switch语法,它避免了大量的break出现在代码中,如果case "你好","早上好","中午好","下午好"满足,则返回"你好呀",而不像原来那样把所有结果都返回。对于同一个需求,part1的写法显然比part2的写法方便一些。

Record(记录)类(Java 14)

record关键字可以将某个类标识为记录类,被该关键字标记的类会自动生成Getter和Setter以及hashCode()toString()方法,同时,该类的值不会再被改变!
举例:

//Record类只能这么定义
public record StudentRecord(String id, String name, int age) {}
@Testpublic void recordClass(){StudentRecord sr=new StudentRecord("123","张三",12);System.out.println(sr);System.out.printf("""id:%s,姓名:%s年龄:%d""",sr.id(),sr.name(),sr.age());}

这个类在前后端分离项目中是很有用的。

case的多个值匹配(Java 14)与case返回值(Java 14,17)

其实从Java 12开始就对switch进行改动了,在Java 14中,switch可以对多个值进行比较了,相比于以前的case 1:case 2...这种简化了很多,在yield关键字章节使用的就是这个特性。

String response=switch (next){case "你好","早上好","中午好","下午好"->"你好呀";case "我不是很好","我不好","我难受"->"不要伤心嘛";default -> "需要帮助吗?";};

下面的写法也是正确的

  switch (next){case "你好","早上好","中午好","下午好":System.out.println("你好呀");case "我不是很好","我不好","我难受":System.out.println("不要伤心嘛");default :System.out.println( "需要帮助吗?");};

第一个写法是可以将"你好呀"、"不要伤心嘛"这类字符串作为switch返回值赋值给response的。
第二个写法则只能进行多值匹配,switch没办法返回任何值,原因可以参见yield关键字章节

Sealed(密闭)类(Java 15)

有时候可能不希望某个接口或者类被某个类实现或者继承,那么,密闭类就可以满足这个要求。

public sealed interface AnimalMethods permits Animal{public void call();
}
public sealed class Animal implements AnimalMethods permits Sheep,Cow{private String name;private int age;private Date birthDate;//Getter,Setter...@Overridepublic void call() {System.out.println("任何动物都有叫声");}
}
public non-sealed class Sheep extends Animal{@Overridepublic void call() {System.out.println("咩~");}
}
public non-sealed class Cow extends Animal{@Overridepublic void call() {System.out.println("牟~");}
}

首先我定义了一个密闭接口AnimalMethods并限制只能让Animal类或者接口来实现或者继承它。
然后创建一个类Animal实现接口AnimalMethods,同时Animal类也是一个密闭类,要求只有Sheep类和Cow类可以继承这个类。
最后创建SheepCow类。

密闭类有这样的性质:

  1. seald关键字不能和final以及record关键字一起使用
  2. seald关键字必须和permits关键字一起使用
  3. 密闭类必须有子类且必须限制所有子类,密闭接口必须有子接口或者实现类并且限制所有子接口以及实现类。
    以上面的代码为例,将 public sealed class Animal implements AnimalMethods permits Sheep,Cow改为public sealed class Animal implements AnimalMethods permits Sheep同时保持继承关系不变,那么会编译失败,因为,Cow类也是Animal类的子类,因此permites也必须包含Cow
  4. 使用seald标记的类或接口其子类或子接口必须是sealdnon-seald(非密闭)、final中的一种

switch类型判断(Java 17)

switch可以代替instanceof关键字对对象的类型进行判断。
需要注意的是,在Java 19正式版中并不支持这个功能。

Object number=new Student();//这个功能目前在孵化中var result=switch (number){case null-> "啊哦";case Integer i->"int";case Student s->"Student";default -> "Oops";};System.out.println(result);

这确实是一个很大的改进,希望以后可以实装

文本块(Java 17)

在Record(记录)类(Java 14)章节可以看到文本块的影子,使用"""(3个英文双引号)就可以定义一个文本块。它的目的是为了解决“使用+链接带有转义字符的字符串导致的代码难看的问题。”
在以前,想要输出含有转义字符的字符串同时还要方便代码编写是不可能的,只能通过+完成,比如:

public static void main(String[] args){System.out.printf("姓名:%s"+"性别:%c"+"年龄:%d","张三",'m',18);
}

很痛苦,这样写代码很难看,有了文本块后就可以这么写:

public static void main(String[] args){System.out.printf("""姓名:%s性别:%c年龄:%d""","张三",'m',18);
}

方便了很多,而且代码也不是很难看。
(你问我printf是新功能吗?——不是!)

switch复杂表达式(Java 19 第三次预览(正式版Java 19该功能被移除,不排除以后会加入的可能))

你是否被大量的if-else所困扰?现在,解决方案来了,你可以使用switch进行表达式的判断了。

Student student=new Student();student.setAge(12);String result= switch (student){case Student s when s.getAge()>=18->"已成年";default -> "未成年";};System.out.println(result);
Student student=new Student();
student.setAge(12);
if(student.getAge>=18){System.out.println("已成年");
else{System.out.println("未成年");
}

这个例子很简单,如果你要进行多种判断的话无疑这种写法是最方便的也更整洁。
但是,在正式的Java19中不支持这个功能。

评价

以上只是介绍了这些新特性的一小部分,实际上,这几个版本都对性能、开发复杂程度做了一定的优化。同时,也让Java的开发变得简单了一些。
关于市场:由于目前国内大部分的公司所开发的项目使用的还是Java 8。因此,市场上在相当长的一段时间内还是会青睐Java 8。所以对于小白而言还是以Java 8的学习为主,高版本的Java感兴趣的话可以自己去了解。
对于框架:Springboot 3已经明确要求使用Java 17以上,因此,在不久的将来,如果依然使用Springboot开发的话那么Java 8会被淘汰掉。由于Java 19刚刚发布不久,很多框架(如Mybatis-plus)还没有做支持,所以,最近不要使用Java19+Springboot做一些项目,过一段时间之后再看看。

代码

https://blacol.lanzoue.com/iysxK0ibyxgd



喜欢的朋友记得点赞、收藏、关注哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/2934.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

软件设计师-上午题-15 计算机网络(5分)

计算机网络题号一般为66-70题&#xff0c;分值一般为5分。 目录 1 网络设备 1.1 真题 2 协议簇 2.1 真题 3 TCP和UDP 3.1 真题 4 SMTP和POP3 4.1 真题 5 ARP 5.1 真题 6 DHCP 6.1 真题 7 URL 7.1 真题 8 浏览器 8.1 真题 9 IP地址和子网掩码 9.1 真题 10 I…

nodejs批量修改word文档目录样式

工作中遇到一个需求:写个nodejs脚本,对word文档(1000+个)的目录页面进行美化。实现过程遇到不少麻烦,在此分享下。 整体思路 众所周知,Docx格式的Word文档其实是个以xml文件为主的zip压缩包,所以,页面美化整体思路是:先将文档后缀名改为zip并解压到本地,然后将关键的…

MathType在Word中的安装与配置记录

一、记录过程 1.MathType安装包下载 可直接下载本人已经安装过的安装包&#xff0c;亲测可以使用&#xff0c;下载链接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1g-iOgKIqzSNz0E5rEUryug 提取码&#xff1a;1kb3 2.安装后配置 word中会出现mathtype的选项…

无人机之中继通信技术篇

一、定义与原理 无人机中继通信技术是指通过无人机搭载中继设备&#xff0c;将信号从一个地点传输到另一个地点&#xff0c;从而延长通信距离并保持较好的通信质量。其原理类似于传统的中继通信&#xff0c;即在两个终端站之间设置若干中继站&#xff0c;中继站将前站送来的信号…

轴流风机和后倾式风机的安装要求

后向离心风机风压大&#xff0c;风量足&#xff0c;安装方便。因为不需要蜗壳&#xff0c;所以风道往往需要自行设计&#xff0c;而风道的合理与否&#xff0c;大大影响了后向离心风机的效率。那么后向离心风机的安装技巧有哪些&#xff1f;怎样达到风机的最佳使用效果呢&#…

植物神经紊乱不用怕,这些维生素来帮你!

你是否经常感到身体疲惫、情绪波动大、心悸、胸闷&#xff1f;这可能是植物神经紊乱在作祟。别担心&#xff0c;通过合理的维生素补充&#xff0c;可以有效缓解症状&#xff0c;提升生活质量。今天&#xff0c;我们就来聊聊植物神经紊乱患者应该补充哪些维生素。 &#x1f50d…

使用C语言进行信号处理:从理论到实践的全面指南

1. 引言 在现代操作系统中&#xff0c;信号是一种进程间通信机制&#xff0c;它允许操作系统或其他进程向一个进程发送消息。信号可以用来通知进程发生了一些重要事件&#xff0c;如用户请求终止进程、硬件异常、定时器超时等。掌握信号处理技术对于开发健壮、高效的系统程序至…

LabVIEW配电产品精度测试系统

开发了一种基于LabVIEW平台的配电产品精度测试系统&#xff0c;通过自动化测试流程实现更高的测试准确性与效率。系统采用串口和TCP通信技术&#xff0c;与多功能交流采样变送器和配电设备无缝数据交互&#xff0c;提升了测试工作的可靠性和一致性。 一、项目背景 在配电产品…

基于JAVA SpringBoot和Vue社区网格化管理服务平台设计

摘要 本文旨在设计并实现一个基于Java SpringBoot和Vue技术的社区网格化管理服务平台。该平台主要包括用户功能和管理员功能两大部分&#xff0c;用户功能涵盖单位管理、问卷调查、论坛讨论、公告查看等&#xff1b;管理员功能则包括单位管理、基础数据维护、帖子和公告类型管…

鸢尾博客项目开源

1.博客介绍 鸢尾博客是一个基于Spring BootVue3 TypeScript ViteJavaFx的客户端和服务器端的博客系统。项目采用前端与后端分离&#xff0c;支持移动端自适应&#xff0c;配有完备的前台和后台管理功能。后端使用Sa-Token进行权限管理,支持动态菜单权限&#xff0c;服务健康…

IBinder源码分析

基础概念 binder 是 Android 中主要的跨进程通信方式&#xff0c;binder 驱动和 service manager 分别相当于网络协议中的路由器和 DNS&#xff0c;并基于 mmap 实现了 IPC 传输数据时只需一次拷贝。binder 包括 BinderProxy、BpBinder 等各种 Binder 实体&#xff0c;以及对 …

PDF Reader Pro for mac激活版 PDF编辑阅读器

PDF Reader Pro阅读器是一款用户必备的集管理、编辑、转换、阅读功能于一体的专业的全能PDF阅读专家。快速、易用、强大&#xff0c;让您出色完成 PDF 工作&#xff0c;深受全球9000万用户的喜爱。用户可轻松使用PDF Reader Pro进行文档阅读、编辑、注释、填写Form表单、转换、…

图像分割从基础到进阶:阈值化、K-means和Mean-Shift算法的应用

图像分割是计算机视觉中的一项关键技术&#xff0c;用来将图像划分为若干个 有意义 的区域&#xff0c;以便后续的图像处理和分析工作。根据任务的不同&#xff0c;图像分割可以进一步细分为语义分割、实例分割和全景分割&#xff1a; 语义分割 (Semantic Segmentation) 对图像…

生产消费者模型

线程同步 互斥锁(互斥量)条件变量生产/消费者模型 一、互斥锁 C11提供了四种互斥锁&#xff1a; mutex&#xff1a;互斥锁。timed_mutex&#xff1a;带超时机制的互斥锁。recursive_mutex&#xff1a;递归互斥锁。recursive_timed_mutex&#xff1a;带超时机制的递归互斥锁…

国标GB28181视频平台EasyCVR私有化视频平台工地防盗视频监控系统方案

一、方案背景 在当代建筑施工领域&#xff0c;安全监管和防盗监控是保障工程顺利进行和资产安全的关键措施。随着科技进步&#xff0c;传统的监控系统已不足以应对现代工地的安全挑战。因此&#xff0c;基于国标GB28181视频平台EasyCVR的工地防盗视频监控系统应运而生&#xf…

WindowsDocker安装到D盘,C盘太占用空间了。

Windows安装 Docker Desktop的时候,默认位置是安装在C盘,使用Docker下载的镜像文件也是保存在C盘,如果对Docker使用评率比较高的小伙伴,可能C盘空间,会被耗尽,有没有一种办法可以将Docker安装到其它磁盘,同时Docker的数据文件也保存在其他磁盘呢? 答案是有的,我们可以…

【AI日记】24.11.01 LangChain、openai api和github copilot

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 工作1 内容&#xff1a;学习deeplearning.ai的免费课程地址&#xff1a;LangChain Chat with Your DataB站地址&#xff1a;https://www.bilibili.com/video/BV148411D7d2github代码&#xff1a;https:…

HTML静态网页成品作业(HTML+CSS)——花主题介绍网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

WinCC V7.5 SP1VBS全局变量的使用

1 <概述> 在 WinCC 使用过程中&#xff0c;有很多应用场合需要把获得的数据保存下来&#xff0c;在其它事件 中来使用&#xff0c;例如在 WinCC 运行后去读取自定义的配置文件中的参数&#xff0c;在控制相应设 备时需要根据这些参数来确定控制方式&#xff0c;那么就需…

Charles抓包_Android

1.下载地址 2.破解方法 3.安卓调试办法 查看官方文档&#xff0c;Android N之后抓包要声明App可用User目录下的CA证书 3.1.在Proxy下进行以下设置&#xff08;路径Proxy->Proxy Settings&#xff09; 3.1.1.不抓包Windows&#xff0c;即不勾选此项&#xff0c;免得打输出不…