关于java:Java-17中对switch的模式匹配增强

38次阅读

共计 1120 个字符,预计需要花费 3 分钟才能阅读完成。

还记得 Java 16 中的 instanceof 加强 吗?

通过上面这个例子再回顾一下:

Map<String, Object> data = new HashMap<>();
data.put("key1", "aaa");
data.put("key2", 111);
if (data.get("key1") instanceof String s) {log.info(s);
}

下面这个场景里,Map 中的 Value 值存在不同的类型,所以应用 instanceof 来判断取出的 value 是什么类型,而后依据不同类型来进行解决。那么,接下来持续思考一个问题,如果这个 Map 中的 Value 可能有这几种类型:String、Integer、Double,咱们须要对不同类型别离做不同的解决,是不是解决构造要这样写:

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);
}

面对这样的 if 语句构造,看着是不是很好受?依据以往的教训,是不是这个时候想到用 switch 来改良一下呢?然而再推敲下,发现这里判断的时候又用到了instanceof,仿佛一下又不好下手了?

于是,在面对这种场景的时候,Java 17 对 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("");
}

有没有一下变得很简洁呢?

这里的几个重点值得关注:

  1. case条件中间接涵盖了类型的判断和类型的转换,这个性能相似与 Java 16 中对 instanceof 的加强
  2. 每个 case 的解决逻辑用 Lambda 语法来实现,能够免去 break 语句(这是 JDK 12 中引入的个性)

另外,要留神的是,对于 switch 表达式中模式匹配的性能,JDK 17 中的实现还是 preview 版本,所以理解为主,目前还不举荐用于正式环境,不排除后续有进一步改良的可能。

好了,明天的分享就到这里!如果您学习过程中如遇艰难?能够退出咱们超高品质的技术交换群,参加交换与探讨,更好的学习与提高!另外,不要走开,关注我!继续更新 Java 新个性专栏!

欢送关注我的公众号:程序猿 DD。第一工夫理解前沿行业音讯、分享深度技术干货、获取优质学习资源

正文完
 0