Java 21 正式发布!新特性专栏继续更起来了~

2023-09-20 16:44:11 浏览数 (1)

就在昨天晚间,Oracle公司宣布Java 21正式发布。该版本是继JDK 17之后最新的长期支持版本(LTS),将获得至少8年的支持!

Java 21 号称具有数千项性能、稳定性和安全性改进。新的 JDK 21 包括对 15 项改进的抢先体验,这些增强功能是在 Oracle CloudWorld 2023 会议上宣布的,包括支持虚拟线程以提高整体吞吐量,以及增加对向量应用编程接口(API)的支持,从而更轻松地构建涉及人工智能 AI 模型的 Java 应用。

相信关注DD的读者知道,去年我开过这样一个坑,后来太监了...

最近,趁着Java 21准备继续连载下去,把之前一大波没更新的特性和经多次完善再这次确定下来的特性再串一遍,欢迎收藏!今天先来学习两个:switch的模式匹配和Record Patterns(不知道怎么翻译好,就不翻了

地址:https://www.didispace.com/java-features/

switch的模式匹配

其实在之前的Java 17新特性中,我们介绍过关于JEP 406: switch的模式匹配,但当时还只是关于此内容的首个预览版本。之后在JDK 18、JDK 19、JDK 20中又都进行了更新和完善。如今,在JDK 21中,该特性得到了最终确定!下面,我们就再正式学习一下该功能!

在以往的switch语句中,对于case中的类型匹配限制是很多的。比如下面这个例子中的Map中可能存储了不同类型的对象,我们要判断的时候,就只能依靠if-else来完成。

代码语言:javascript复制
Map<String, Object> data = new HashMap<>();
data.put("key1", "aaa");
data.put("key2", 111);
if (data.get("key1") instanceof String s) {
  log.info(s);
}

if (data.get("key") instanceof String s) {
  log.info(s);
} else if (data.get("key") instanceof Double s) {
  log.info(s);
} else if (data.get("key") instanceof Integer s) {
  log.info(s);
}

现在开始,这样的类型判断关系,就可以简化为如下的switch代码:

代码语言:javascript复制
switch (data.get("key1")) {
  case String s  -> log.info(s);
  case Double d  -> log.info(d.toString());
  case Integer i -> log.info(i.toString());
  default        -> log.info("");
}

这个功能还是非常有用的,尤其是存在一些抽象封装的时候,可能存在一些父子、兄弟等关系类的时候,为了判断是什么类型,就不用写很多if来处理了,代码简洁度可以得到进一步的优化。

对于上面的例子,还没有升级到Java 17的用户,可能还涉及一些其他新特性,有需要的可以补充学习一下: 第一个是Java 16中的instance of增强;第二个是switch中使用Lambda的增强。

这里顺手这里给大家推荐下我们自研的Youtube视频语音转换插件(https://youtube-dubbing.com/),一键外语转中文,英语不好的小伙伴也可以轻松的学习油管上的优质教程了,下面是演示视频,可以直观的感受一下:

Record Patterns

记录模式(Record Patterns)第一次发布预览是在JDK 19、随后又在JDK 20中进行了完善。现在,Java 21开始正式推出该特性优化。下面我们通过一个例子来理解这个新特性。

代码语言:javascript复制
record Point(int x, int y) {}

static void printSum(Object obj) {
    if (obj instanceof Point p) {
        int x = p.x();
        int y = p.y();
        System.out.println(x y);
    }
}

上述代码中定义了一个名为Point的record类(Java 16中的新特性),如果我们想要获取、操作Point中的x和y的话。就不得不先完成类型判断、类型转换、数据解构。所以,这里为了实现x y总共需要4行代码。而在Java 21之后,只需要2行代码就能完成:

代码语言:javascript复制
static void printSum(Object obj) {
    if (obj instanceof Point(int x, int y)) {
        System.out.println(x y);
    }
}

可以看到,类型判断、类型转换、record值的解构都一气呵成了,所以代码量得到了简化。

0 人点赞