还记得 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("");
}
有没有一下变得很简洁呢?
这里的几个重点值得关注:
case
条件中间接涵盖了类型的判断和类型的转换,这个性能相似与 Java 16 中对 instanceof 的加强- 每个
case
的解决逻辑用Lambda
语法来实现,能够免去break
语句(这是 JDK 12 中引入的个性)
另外,要留神的是,对于 switch 表达式中模式匹配的性能,JDK 17 中的实现还是 preview 版本,所以理解为主,目前还不举荐用于正式环境,不排除后续有进一步改良的可能。
好了,明天的分享就到这里!如果您学习过程中如遇艰难?能够退出咱们超高品质的技术交换群,参加交换与探讨,更好的学习与提高!另外,不要走开,关注我!继续更新 Java 新个性专栏!
欢送关注我的公众号:程序猿 DD。第一工夫理解前沿行业音讯、分享深度技术干货、获取优质学习资源