还记得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 14新个性:switch表达式加强引入的性能)
另外,要留神的是,对于switch表达式中模式匹配的性能,JDK 17中的实现还是preview版本,所以理解为主,目前还不举荐用于正式环境,不排除后续有进一步改良的可能。

本篇内容对应视频已实现录制,点击查看:Java 17 新个性:switch的模式匹配(Preview)

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

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