3

Java 17 新特性:switch的模式匹配(Preview)

 2 years ago
source link: http://blog.didispace.com/java17-jep406-pattern-matching-for-switch-preview/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Java 17 新特性:switch的模式匹配(Preview)

还记得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新特性专栏


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK