查看原文
其他

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

DD 程序猿DD 2023-11-28


就在昨天晚间,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来完成。

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代码:

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开始正式推出该特性优化。下面我们通过一个例子来理解这个新特性。

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行代码就能完成:

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

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

好了,今天的分享就到这里,欢迎关注Java新特性专栏:

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

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。

推荐阅读

··································

点击卡片关注程序猿DD,分享一线干货

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存