我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜

自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15。
恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 JDK 引入的新功能。
这几天升级了 IDEA,顺便体验了一下 JDK15 的新特性。
虽然我知道你们可能跟我一样JDK8 都还没用熟,但是无妨,看看新版本 JDK 来酸一下。

Text Blocks 最终定板
之前版本的 JDK,如果我们需要插入 HTML,XML,SQL 或 JSON 片段,非常麻烦,需要对里面符号进行各种转义。
所以我每次都会在其他编辑器将 HTML ,XML 等编辑好,然后直接复制到 IDEA 中,IDEA 自动会对这些字符转义。

每次复制进去就变成上图的效果,如果上面字符再多点,阅读起来就会更难,并且难以维护。
所幸 IDEA 提供了一个 Inject Language 功能,我们可以在里面快速方便的编辑。

Java 开发者也关注到这个问题,他们在 JDK13 引入的一个新的预览特性「Text Blocks」,可以使用三引号将复杂的字符串赋值,从而让我们从各种转义中解脱出来,可以更加方便的编辑字符串。
这个功能在其他语言还是比较常见的,比如 Python 等。
Text Blocks 新功能在 JDK14 再次以预览功能引入,最终在 JDK15 成为新版本的正式功能。
下面我们来对比一下使用 Text Blocks 与之前区别:



Records (Second Preview)
JDK14 引入一个新的预览特性 record 语法,可以快速创建一个纯数据类,并且不用去生成 getter,toString 等。
使用下面的语法就可以快速创建一个数据类:
public record Point(int x,int y) {
}
JDK15 是 record 这个语法的第二次预览,这个版本增加一个新的功能 「local record」,可以在一个方法在快速创建一个类,以便于方法中业务逻辑计算。
在以下示例中,使用本地记录 MerchantSales 对商人和每月销售额的汇总进行建模,使用此记录可提高以下流操作的可读性:
下面例子的中我们新建一个类 MerchantSales,然后按照销售人员对每月的销售额汇总排序。
List<Merchant> findTopMerchants(List<Merchant> merchants, int month) {
// Local record
record MerchantSales(Merchant merchant, double sales) {}
return merchants.stream()
.map(merchant -> new MerchantSales(merchant, computeSales(merchant, month)))
.sorted((m1, m2) -> Double.compare(m2.sales(), m1.sales()))
.map(MerchantSales::merchant)
.collect(toList());
}
原先如果需要使用这种功能,我们不得不创建一个内部类,后续可能再也不会用到,使用 local record就解决这个尴尬的问题。
除了 local record 我们还可以创建 local enums 以及 local interface。
// local enums
public void organisePeople(List<Person> people) {
enum Role {
Employee, Customer, Both, None
}
HashMap<Role, List<Person>> peopleByRole = new HashMap<>();
people.stream()
.filter(Person::isCustomer)
.forEach(person -> peopleByRole.computeIfAbsent(Role.Customer, role -> new ArrayList<>())
.add(person));
// 其他业务逻辑
}
// local interface
public void localInterface() {
interface MyInterface {
void doSomething();
}
MyInterface testInterface = new MyInterface() {
@Override
public void doSomething() {
System.out.println("Hello World!");
}
};
// 其他业务逻辑
}
最后使用这个特性需要注意一点,local record , local enums ,local interface 创建都是一个局部变量,是不能被传递其他方法引用。
Pattern Matching for instanceof (Second Preview)
我们应该都看到过下面这种代码:
if (obj instanceof String) {
String str = (String) obj;
// use str
}
上面代码意图非常简单,当 obj 对象是 String 类,就将其强制转换,然后进行其他业务操作。
这种写法,类型转换还是比较繁琐,Pattern Matching for instanceof 这个新语法特性,可以帮我们省略这种类型转换动作。这是一个在 JDK14 引入一个预览特性,JDK 15 开始第二次预览。
上面的代码使用 pattern matcher,就可以被修改如下:
if (obj instanceof String s) {
s.contains("T");
} else {
// 编译错误
//s.contains("T");
}
另外如果在 IDEA 中还可以提示我们将代码转化成 pattern matcher 。

大家应该都看过 Effective Java 这本神书吧,里面第八条关于 Equals 有一个例子:

使用 pattern matcher 我们就可以使用下面更加清晰的代码代替:

Sealed Classes (Preview)
Java 中一个正常普通类/接口允许被其他子类继承/实现,但是有时在日常开发中,我们可能希望只有特定的类才能继承扩展。
现有的 Java 语法中存在一些方法,可以限制子类扩展,比如说:我们可以使用 final 修饰类
public final class String
不过这样之后,我们就没办法再继承这个类。
其次我们可以限制的类的范围,比如说不使用 public 修饰类/接口,即使用 default 范围,这样只有同一个包才能继承/实现。
interface DefaultExample {
}
不过使用这种方式,又很尴尬,这个类就无法被其他包使用。
为了解决上述问题,JDK 15 引入一个新的预览特性 Sealed Classes,即可以限定类的扩展,也可以被外部使用。
public sealed class Shape
permits Circle, Rectangle, Square {...}
使用 sealed 修饰之后,Shape 类只能被 Circle,Rectangle,Square继承,再也不能被其他类继承。
同时 Shape 的子类存在一些限制,必须使用 final 修饰,表明这个类无法再被扩展:
public final class Circle extends Shape {...}
或者继续使用 sealed 表示子类只能被指定类继承:
public sealed class Rectangle extends Shape
permits TransparentRectangle, FilledRectangle {...}
public final class TransparentRectangle extends Rectangle {...}
又或者说使用 non-sealed 表明这个子类不限制子类扩展,可以被其他任何类扩展实现。
另外 sealed class 还可以跟上述 record 语法一起使用。
public sealed interface Expr
permits ConstantExpr, PlusExpr, TimesExpr, NegExpr {...}
public record ConstantExpr(int i) implements Expr {...}
public record PlusExpr(Expr a, Expr b) implements Expr {...}
public record TimesExpr(Expr a, Expr b) implements Expr {...}
public record NegExpr(Expr e) implements Expr {...}
ZGC
ZGC(Z Garbage Collector) 这是一款在 JDK11 引入的的具有实验性质的低延迟的 GC 收集器。
这款 GC 收集器的希望在尽可能对吞吐量影响不大的前提下,实现在任意堆内存大小都可以把垃圾收集器的停顿时间限制在十毫秒以内的低延迟。
ZGC 经过这两三年的迭代优化,终于在 JDK15 中正式引入,标志着 ZGC 可以正式应用于生产应用。
JDK15 中默认虚拟机还是 G1,如果需要使用 ZGC,需要在启动参数中加入如下参数:
-XX:+UseZGC command-line
最后
本来这篇文章是准备写下 IDEA 2020.2 新版本特性,顺带介绍一下 JDK15 新特性的。
可是没想到写着写着,JDK15 相关的篇幅就过长了,所以就单独拿出来了。
最后,最后,JDK 都发布到 15 了,而我却还在用 JDK 7 ,真是个悲伤的故事,逃了逃了!

我是楼下小黑哥,每天学习一点点,成长亿点点!!
参考链接
https://openjdk.java.net/projects/jdk/15/
欢迎关注我的公众号:程序通事,获得日常干货推送。如果您对我的专题内容感兴趣,也可以关注我的博客:studyidea.cn
我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜的更多相关文章
- 我还在生产玩 JDK7,JDK 15 却要来了!
自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15. 恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 ...
- Java程序员必备基础:JDK 5-15都有哪些经典新特性
前言 JDK 15发布啦~ 我们一起回顾JDK 5-15 的新特性吧,大家一起学习哈~ 本文已经收录到github ❝ https://github.com/whx123/JavaHome ❞ 「公众 ...
- Java 15 正式发布, 14 个新特性,刷新你的认知!!
JDK 15 2020/09/15 如期而至! 这个时间牛逼啊,和苹果发布会同天? OracleJDK 15 发布地址: https://www.oracle.com/java/technologie ...
- JDK几个高版本的新特性
JDK 高版本的新特性 1.JDK5的新特性: 自动拆装箱 见Integer部分笔记 泛型 增强for循环 静态导入 可变参数 见集合部分笔记 枚举 是指将变量的值一一列出来,变量的值只限于列举出来的 ...
- jdk 9 10 11 12 13 新特性
jdk 9 新特性 1.集合加强 jdk9 为所有集合(List/Set/Map)都增加了 of 和 copyOf 方法,用来创建不可变集合,即一旦创建就无法再执行添加.删除.替换.排序等操作,否则将 ...
- java并发学习--第八章 JDK 8 中线程优化的新特性
一.新增原子类LongAdder LongAdder是JDK8中AtomicLong的增强工具类,它与AtomicLong最大的不同就是:在多线程场景下,LongAdder中对单一的变量进行拆分成多个 ...
- JDK 16 正式发布,一次性发布 17 个新特性…不服不行!
上一篇:Java 15 正式发布, 14 个新特性 JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. ...
- 史上最全jdk新特性总结,涵盖jdk8到jdk15!
前言 在本文中,我将描述自第8版以来Java最重要且对开发人员友好的功能.为什么会有这样的主意?在Web上,您可以找到许多文章,其中包含每种Java版本的新功能列表.但是,由于缺少文章,因此无法简要概 ...
- Java 15 新特性:文本块
大家好,我是DD,今天继续来学点Java的新特性! 假设有这样一个场景,我们需要做一个工具.用来自动生成项目文档,文档可以通过浏览器查看,所以最后产出物肯定是一堆html文件.为了让这些html文件更 ...
随机推荐
- javascript基础(一): 浏览器控制台使用Element,console,network,source,application
console https://www.jianshu.com/p/67bcb481d1c5 Element https://www.kkpan.com/article/1845.html
- 理解Spring(一):Spring 与 IoC
目录 什么是 Spring Spring 的整体架构 什么是 IoC Bean 的概念 Spring 的基本使用 Spring 的两种 IoC 容器 Spring 容器的基本工作原理 Spring B ...
- 转自fineui论坛:解决fineui框架开发中的Designer.aspx.cs丢失问题
在开发的时候碰到个问题,本来好好的Edit.aspx Edit.aspx.cs Edit.Designer.aspx.cs编辑Edit.aspx然后保存,编译的时候 发现Edit.aspx.cs里 ...
- Python Ethical Hacking - MODIFYING DATA IN HTTP LAYER(2)
MODIFYING DATA IN HTTP LAYER Edit requests/responses. Replace download requests. Inject code(html/Ja ...
- 通过cmd进入指定D盘下的某个文件夹
有时候我们在使用电脑的时候,想使用cmd命令提示符,进入d盘,怎么操作呢,下面来分享一下方法 案例描述:如果进入D盘下的test文件夹(D:\test) 1.win10系统环境下,点击搜索输入[cmd ...
- spring读取jdbc(file方式)
使用PropertyPlaceholderConfigurer类载入外部配置 在Spring项目中,你可能需要从properties文件中读入配置注入到bean中,例如数据库连接信息,memcache ...
- OFD呼之欲来、来之跚跚,谁之罪?
软件国产化的浪潮势不可挡,美国逼得逾甚,我们压迫感逾强,唯有奋起直追方慰平生之志. 在板式文档领域,pdf已成为国际标准,亦可称为美国标准:它在该领域一枝独秀,已形成一览众山小之势! pdf出道20余 ...
- Ansible 远程服务器连接 Internet 测试
Email 连接: lonnyliu@126.com 需求 在使用Ansible过程中不可避免需要了解远端服务器是否能够联通外网,以便进行在线安装软件或者其他.对于运维人员来说普遍的办法有 1. 登录 ...
- jmeter调试元件Debug Sampler的使用
@@@@@@@@@@@@@@@ 活在当下 今天记录一下jmeter调试工具Debug Sampler的心得,调试对于计算机从业人员来说是家常便饭,jmeter虽然代码不多,但是也需要调试,那么如何进行 ...
- MacOS下VUEJS简单入门
微信搜索"艺术行者",关注并回复关键词"vue"获取课程资料 上传的在线学习视频(黑马和传智双元,感谢) VueJs概述与快速入门 学习之前假设你已了解关于 H ...