自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15。

恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 JDK 引入的新功能。

这几天升级了 IDEA,顺便体验了一下 JDK15 的新特性。

虽然我知道你们可能跟我一样JDK8 都还没用熟,但是无妨,看看新版本 JDK 来酸一下。

Text Blocks 最终定板

之前版本的 JDK,如果我们需要插入 HTMLXMLSQL 或 JSON 片段,非常麻烦,需要对里面符号进行各种转义。

所以我每次都会在其他编辑器将 HTML ,XML 等编辑好,然后直接复制到 IDEA 中,IDEA 自动会对这些字符转义。

每次复制进去就变成上图的效果,如果上面字符再多点,阅读起来就会更难,并且难以维护。

所幸 IDEA 提供了一个 Inject Language 功能,我们可以在里面快速方便的编辑。

Java 开发者也关注到这个问题,他们在 JDK13 引入的一个新的预览特性「Text Blocks」,可以使用三引号将复杂的字符串赋值,从而让我们从各种转义中解脱出来,可以更加方便的编辑字符串。

这个功能在其他语言还是比较常见的,比如 Python 等。

Text Blocks 新功能在 JDK14 再次以预览功能引入,最终在 JDK15 成为新版本的正式功能。

下面我们来对比一下使用 Text Blocks 与之前区别:

Html

SQL

JS

Records (Second Preview)

JDK14 引入一个新的预览特性 record 语法,可以快速创建一个纯数据类,并且不用去生成gettertoString 等。

使用下面的语法就可以快速创建一个数据类:

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 类只能被 CircleRectangleSquare继承,再也不能被其他类继承。

同时 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 ,真是个悲伤的故事,逃了逃了!

我还在生产玩 JDK7,JDK 15 却要来了!的更多相关文章

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

    自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15. 恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 ...

  2. Android事件总线还能怎么玩?

    作者简介:何红辉,Android工程师,现任职于友盟. 顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件 ...

  3. 玩好JDK[转]

    ref: https://www.cnblogs.com/zuoxiaolong/p/life53.html java-reference:https://docs.oracle.com/en/jav ...

  4. JDK 15 JAVA 15的新特性展望

    目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: T ...

  5. linux(centos8):安装java jdk 15 (java 15)

    一,下载jdk15 官方网站: https://www.oracle.com/java/ 下载页面: https://www.oracle.com/cn/java/technologies/javas ...

  6. JDK 15已发布,你所要知道的都在这里!

    JDK 15已经在2020年9月15日发布!详情见 JDK 15 官方计划.下面是对 JDK 15 所有新特性的详细解析! 官方计划 2019/12/12 Rampdown Phase One (fo ...

  7. Apache DolphinScheduler 需要的sudo,还可以这么玩,长见识了!

    Apache DolphinScheduler(incubator)需要的sudo,还可以这么玩,长见识了! 在新一代大数据任务调度 - Apache DolphinScheduler(以下简称dol ...

  8. Java 11 已发布,String 还能这样玩!

    在文章<Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码>中,我有介绍到 Java 11 的八个新特性,其中关于 String 加强部分,我觉得有点意思,这里单独再拉出来 ...

  9. Java 12 骚操作, String居然还能这样玩!

    Java 13 都快要来了,12必须跟栈长学起! Java 13 即将发布,新特性必须抢先看! 栈长之前在Java技术栈微信公众号分享过<Java 11 已发布,String 还能这样玩!> ...

随机推荐

  1. 使用Kali中的Metasploit生成木马控制Windows系统

    一.概念:Kali基于debin的数字取证系统,上面集成了很多渗透测试工具,其前身是BT5 R3(BtackTrack). 其中Metasploit是一个综合利用工具,极大的提高了攻击者的渗透效率,使 ...

  2. eclipse及idea使用问题记录(为了方便github同步,重新用Markdown写了一篇)

    使用eclipse或idea的时候会遇到各式各样的小问题,解决方案其实网上也大都搜得到,但是下次遇到的时候总是想不起来如何解决,还要花费时间再次查资料.所以以后把遇到的问题都记录一下. @ 目录 Ec ...

  3. HYSBZ-1045 糖果传递

    有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 假设当所有人获得均等的糖果的时候: 每个人手上的糖果的数量为\(ave\) 第\(i\)个人初始时的 ...

  4. 【Flutter 实战】动画序列、共享动画、路由动画

    老孟导读:此篇文章是 Flutter 动画系列文章第四篇,本文介绍动画序列.共享动画.路由动画. 动画序列 Flutter中组合动画使用Interval,Interval继承自Curve,用法如下: ...

  5. IDEA 代码自动补全/自动联想 功能

    IDEA 的代码补全/自动联想功能,可以仅仅输入几个字母,自动补全一整段代码,非常舒服. 代码自动联想功能在 设置 -> Editor -> Live Templates 查看,很多都非常 ...

  6. 创建human用户登录数据库创建表

    根据人力资源管理系统中表的设计,创建human用户登录数据库创建 准备阶段 把运行脚本复制到D:\app\Administrator\product\11.2.0\dbhome_1\demo\sche ...

  7. python笔记-dumps()与loads()的使用

    json.dumps是将一个Python数据类型列表进行json格式的编码解析, 示例如下: >>> import json #导入python 中的json模块 >>& ...

  8. 【python】装饰器听了N次也没印象,读完这篇你就懂了

    装饰器其实一直是我的一个"老大难".这个知识点就放在那,但是拖延症... 其实在平常写写脚本的过程中,这个知识点你可能用到不多 但在面试的时候,这可是一个高频问题. 一.什么是装饰 ...

  9. CVPR2020 面向密集多角度物体检测的动态修正网络(DRN)

    论文链接:https://arxiv.org/pdf/2005.09973.pdf code:https://github.com/Anymake/DRN_CVPR2020 文章概要: 本文是中科院自 ...

  10. Funny Positive Sequence (思维+前缀)

    There are n integers a 1,a 2,…,a n-1,a n in the sequence A, the sum of these n integers is larger th ...