Java新特性(2):Java 10以后

news2025/7/27 4:05:02

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~

虽然到目前为止Java的版本更新还没有什么惊天动地的改变,但总是会冒出一些有趣的小玩意。前面列举了Java9和Java10的一些特色,现在接着来撸一撸Java11之后的新奇特。

Java9更新了Http 2 Client,也说过先不着急看,因为在后续版本中语法会变。这不,到Java11就实现了。最直接的变化就是http相关包名由Java 9的jdk.incubator.http改为Java 11的java.net.http。感觉java.net.http才像那么回事,incubator是个啥呢?好像完全和http不沾边。本着好奇害死猫的精神,查了下incubator的意思:

 

好吧,原来JDK工作组认为http在Java9中出现是个「早产儿」。

再来看看Java11对http的更新,例如通过http访问某度的主页:

// 包名由Java 9的jdk.incubator.http改为Java 11的java.net.http
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
								.uri(URI.create("http://www.baidu.com/"))
								.build();
client.sendAsync(request, BodyHandlers.ofString())
								.thenApply(HttpResponse::body)
								.thenAccept(System.out::println)
								.join();

(现在Lambda表达式几乎无处不在了,如果还不会的话搞不好以后Java代码都看不懂了)

Java11有如下变更:

 

除了http之外,比较有用的就两个:基于嵌套的访问控制(181)和飞行记录器(328)。

所谓基于嵌套的访问控制,其实就是能够判断某个类是不是另一个类的嵌套类。

/**
 * 基于嵌套的访问控制
 * 
 * @author 湘王
 */
public class OuterClass {
	class InnerClass {
		public InnerClass() {
		}

		public void printOuterInt() {
			System.out.println("InnerClass");
		}
	}

	public static void main(String[] args) {
		Class<?> outerClass = OuterClass.class;
		// 得到宿主类
		Class<?> clazz1 = InnerClass.class.getNestHost();
		System.out.println(clazz1.getName());
		// 得到内部类成员
		Class<?>[] clazz2 = OuterClass.class.getNestMembers();
		for (Class<?> class1 : clazz2) {
			System.out.println(class1.getName());
			// 判断类是否是某个类的嵌套类
			System.out.println(outerClass.isNestmateOf(class1));
		}
	}
}

就是这样子用的。

所谓飞行记录器,就是模仿飞机上的黑匣子,是一种低开销的事件信息收集框架,它原来是JDK商业版(是一种大厂之间合作收费的版本)中的一项分析工具,主要数据源于应用程序、JVM和OS,是在故障发生后,能够从事件记录文件中提取出有用信息对故障进行分析。到了Java11,它索性就免费了。

/**
 * 飞行记录器
 *
 * @author 湘王
 */
public class FlightRecorder {
	@Label("Hello World")
	@Description("Helps the programmer getting started")
	static class HelloWorld extends Event {
		@Label("Message")
		String message;
	}

	public static void main(String[] args) {
		HelloWorld event = new HelloWorld();
		event.message = "hello, world!";
		event.commit();
	}
}

运行上述代码时加上JVM参数:

-XX:StartFlightRecording=duration=1s, filename=C:\\recording.jfr

然后再通过飞行记录器来读取数据:

// 读取飞行记录数据
final Path path = Paths.get("C:\\recording.jfr");
List<RecordedEvent> recordedEvents;
try {
	recordedEvents = RecordingFile.readAllEvents(path);
	for (RecordedEvent event : recordedEvents) {
		System.out.println(event.getStartTime() + "," + event.getValue("message"));
	}
} catch (IOException e) {
	e.printStackTrace();
}

至于Java11中的其他更新项:

1、Epsilon GC(no-op GC,318)

2、ZGC可伸缩低延迟垃圾收集器(333)

3、支持TLSv1.3协议(332)

4、动态类文件常量(309)

我个人觉得没啥特别的。

Java11之后,感觉Java是为了更新而更新,新奇特不多。差不多每个版本多那么一个小玩意。

这是Java12的更新:

 

Java12多了一个switch表达式(325):

@SuppressWarnings("preview")
public static void main(String[] args) {
	DayOfWeek day = LocalDate.now().getDayOfWeek();

	int number = switch (day) {
		case MONDAY, WEDNESDAY, FRIDAY, SUNDAY -> 1;
		case TUESDAY, THURSDAY, SATURDAY -> 2;
	};
	System.out.println(number);

	switch (day) {
		case MONDAY:
			System.out.println("星期一");
			break;
		case TUESDAY:
			System.out.println("星期二");
			break;
		case WEDNESDAY:
			System.out.println("星期三");
			break;
		case THURSDAY:
			System.out.println("星期四");
			break;
		case FRIDAY:
			System.out.println("星期五");
			break;
		case SATURDAY:
			System.out.println("星期六");
			break;
		case SUNDAY:
			System.out.println("星期日");
			break;
	}
}

Java13整体上与Java12差不多,没什么变化:

 

唯一比较引人注目的就是模仿Python搞了一个三引号的文本块(而且之前刚出来的时候还只能在idea中实验):

 

然后再敲代码:

@SuppressWarnings("preview")
public static void main(String[] args) {
	// 文本块
	String text = """
	Lorem ipsum dolor sit amet, consectetur adipiscing
	elit, sed do eiusmod tempor incididunt ut labore
	et dolore magna aliqua.
	""";
	System.out.println(text);
}

Java14在Java13基础上就更新的比较多了:

 

其中有一个可能会比较有用的特性:NullPointerExceptions增强(358):

例如码农可能会写这样的代码:

通常会有这样的代码:

User user = new User();

String cityname = user.getDetailInfo().getAddress().getCity().getName();

System.out.println(cityname);

在调用过程中,如果User、DetailInfo、Address、City中有任何一个是null,那么就会抛出NullPointerExceptions,但是比较难于确定倒底是哪一个对象为null。打印出来的异常信息是:

 

但在Java14中,却可以很准确地知道NPE发生在哪里:

先通过JVM参数打开这项特性:-XX:+ShowCodeDetailsInExceptionMessages

 

再次运行相同的代码,可以看到打印出的异常信息变了:

 

不过有个条件:如果代码中已有捕获的NullPointerExceptions,那么就不会执行异常计算。也就是说如果使用了try...catch的话,那这项特性就没用了。

Java14另一个比较有用的特性是Record类型。对,你没看错,不是类,是类型,是和Integer、String一样的类型,叫Record。那什么是Record类型呢?

以前在定义一个JavaBean的时候,通常都会附带定义一些构造函数、getter/setter、equals()、hashCode()以及toString()等无用且无聊的代码。所以出现了第三方类库Lombok,它就可以自动生成这些代码。例如:

final class Point {
	public final int x;
	public final int y;
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	// state-based implementations of equals, hashCode, toString
	// nothing else
}

Record类型就是为了定义这种「纯数据载体」而生的:

record Name(String firstname, String lastname) { }

record Address(String... address) { }

record User(Name name, Address address, int age, ...) {
	static int x;
}

Java15在Java14基础上又做了一系列更新:

 

Java15比较突出的是增加一个称之为「封印类」(360,特性编号也是360,不会是巧合吧)的安全类。所谓封印类,其实就是告诉外界,只有哪些类或接口可以继承或实现它。

// 这段代码声明了一个Shape接口,而permits列表限制了只有「Circle」和「Rectangle」可以实现Shape
// 任何其他尝试扩展Shape的类或接口都将收到编译错误
sealed interface Shape permits Circle, Rectangle {
}

封印类常常和record一起使用:

// 只有「Circle」和「Rectangle」可以实现Shape
// 「Circle」需要一个坐标和半径才能确定
// 「Rectangle」需要两个坐标就能确定
sealed interface Shape permits Circle, Rectangle {
	record Circle(Point center, int radius) implements Shape { }
	record Rectangle(Point lowerLeft, Point upperRight) implements Shape { }
}

后续的Java更新就不再啰嗦了。还是之前的那个态度:Java8是一个非常重要的分水岭,如果不把Lambda表达式和函数式编程学好,后面可能会有很多骚操作都做不了了。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

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

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

相关文章

shell修改永久性别名,压缩与解压缩(zip gzip bzip2)文件上传预下载(sftp)

命令别名&#xff08;永久有效&#xff09; 敲重点&#xff08;写入文件&#xff09;&#xff08;1&#xff09;仅对root有效&#xff0c;写一个命令命为hello,实现的功能为每输入一次hello命令&#xff0c;就有hello&#xff0c;everyone写入文件/file.txt中。 root用户…

[UE][C++]Assimp库安装编译,UE_Assimp插件安装使用,各种三维格式转换

[UE][C]Assimp库安装编译&#xff0c;UE_Assimp插件安装使用&#xff0c;各种三维格式转换写在前面1.作者碎碎念2.结果1.需要准备的软件2.Assimp库编译步骤3.UE_Assimp插件的安装4.UE_Assimp插件样例使用5.Assimp库各种三维格式转换小程序写在前面 1.作者碎碎念 &#xff08;…

ElasticSearch 拼音插件elasticsearch-analysis-pinyin + IK 分词器

ElasticSearch kibana 部署略 创建索引 PUT /nba_20220101 {"mappings": {"properties": {"age": {"type": "integer"},"birthDay": {"type": "date"},"birthDayStr": {"t…

软件方面的文档标准GB/T

在文档标准方面&#xff0c;主要有《软件文档管理指南》&#xff08;GB/T 16680-1996&#xff09;、《计算机软件产品开发文件编制指南》&#xff08;GB/T 8567-2006&#xff09;和《计算机软件需求说明编制指南》&#xff08;GB/T 9385-2008&#xff09;等三个标准。 1. GB/T…

C语言源代码系列-管理系统之学生信息管理系统

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

竞赛开源项目汇总

1、Kaggle Titanic 一个Kaggle竞赛的案例&#xff0c;演示基本的数据转换、分析和可视化技术 https://github.com/agconti/kaggle-titanic 2、Humpback Whale Identification 1st https://github.com/earhian/Humpback-Whale-Identification-1st- 3、Data Science Competi…

【附源码】计算机毕业设计JAVA砂石矿山管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

无代码开发工具突破数据“孤岛“,让数据“动”起来

在信息化的发展过程中&#xff0c;每个独立运作的企业和机构都会使用2-3种以上的软件&#xff0c;而在某些比较成熟的公司&#xff0c;其软件产品的数量就更加惊人了&#xff0c;一个中等规模的公司可以拥有数百套软件系统来支持公司的正常运转。 许多公司的CIO或CTO&#xff0…

智能漏电断路器主要有哪些功能?

安科瑞 华楠 ASCB1 系列智能微型断路器是安科瑞电气股份有限公司 全新推出的智慧用电产品&#xff0c;产品由智能微型断路器与智 能网关两部分组成&#xff0c;可用于对用电线路的关键电气因 素&#xff0c;如电压、电流、功率、温度、漏电、能耗等进行实 时监测&#xff0c;具…

DOX-TF/Ce6/IgG 转铁蛋白/光敏剂/单抗IgG修饰阿霉素/阿霉素白蛋白纳米粒的制备

今天要分享的科研知识是DOX-TF/Ce6/IgG 转铁蛋白/光敏剂/单抗IgG修饰阿霉素/阿霉素白蛋白纳米粒&#xff0c;下面和小编一起来看&#xff01; DOX-IgG 单抗IgG偶联阿霉素的制备&#xff1a; 设计了一种叶酸-聚乙二醇-免疫球蛋白G-阿霉素(FA-PEG-IgG-DOX)的四元靶向给药系统.其…

石子合并系列问题

石子合并 石子合并问题在网上有三个版本&#xff1a; AcWing 282. 石子合并 设有 N 堆石子排成一排&#xff0c;其编号为 1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;N。 每堆石子有一定的质量&#xff0c;可以用一个整数来描述&#xff0c;现在要将这 N 堆石子合…

Android 编译C++

Android 编译C项目前言正文一、基本知识① 要做什么&#xff1f;② JNI是什么&#xff1f;③ NDK是什么&#xff1f;二、配置NDK三、创建新工程① 工程目录说明② 分析cpp文件③ JNI数据类型四、现有工程使用C① 创建C文件② 创建CMake③ 使用C五、源码前言 在开发过程中&#…

集采报告丨国家药品带量采购政策及趋势分析

本人在医药领域从事药品数据分析工作多年&#xff0c;前几天在了解VBP药品带量采购相关事项时遇见了一些网上不好查找答案的问题&#xff08;国家药品带量采购目录、流程、区别、数据分析、政策、执行、结果、公示、网站、意思&#xff09;&#xff0c;对此笔者将其整理出来并解…

追求极致性能,RocketMQ 消息通信详解

1 介绍 RocketMQ 消息队列架构主要包括 NameServe、Broker(Master/Slave)、Producer、Consumer 4 个核心部件&#xff0c;基本执行流程如下&#xff1a; 点击查看大图 NameServer 优先启动。NameServer 是整个 RocketMQ 的“中央大脑” &#xff0c;作为 RocketMQ 的服务注册中…

计算机网络(下)

运输层 运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通…

【深度学习】U-net网络结构搭建 | pytorch

文章目录前言一、U-net网络结构复现&#xff08;上采样部分采用转置卷积nn.ConvTranspose2d&#xff09;1.1、整体结构介绍1.2、encoder部分实现&#xff08;左边网络部分&#xff09;1.3、decoder部分实现&#xff08;右边网络部分&#xff09;1.4、整个网络搭建二、U-net网络…

React源码分析5-commit

前两章讲到了&#xff0c;react 在 render 阶段的 completeUnitWork 执行完毕后&#xff0c;就执行 commitRoot 进入到了 commit 阶段&#xff0c;本章将讲解 commit 阶段执行过程源码。 总览 commit 阶段相比于 render 阶段要简单很多&#xff0c;因为大部分更新的前期操作都…

Dubbo框架基本使用

一&#xff1a;软件架构的演练过程【了解】 单体应用架构--->垂直应用架构--->分布式架构&#xff08;SOA架构/微服务架构) 1.单体应用架构 单体应用架构&#xff0c;就是将一个系统的多个模块做成一个项目&#xff0c;然后部署到tomcat服务器上 优点&#xff1a; 项目架…

第01章+Java概述

课程链接&#xff1a;韩顺平Java_程序举例_哔哩哔哩_bilibili 什么叫程序 程序&#xff1a;计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。 Java版本迭代 官网介绍&#xff1a; Oracle Java SE Support Roadmap LTS为长期支持版本&#xff1a;推荐使用…

IQM的Unimon:一种新的量子比特,可促进量子计算机的实用化

​ 量子处理器中unimon 量子比特的艺术效果图。&#xff08;图片来源&#xff1a;网络&#xff09; 来自芬兰IQM量子计算机公司、阿尔托大学和芬兰VTT技术研究中心的一组科学家发现了一种新的超导量子比特——unimon&#xff0c;可提高量子计算的准确性。该团队已经实现了第一…