使用 switch 进行模式匹配的一个流行用例是在程序中处理不同类型的数据时。考虑以下 WeatherStation 类示例,该类具有不同类型的传感器并返回当前温度:
`公共类气象站{
private Sensor sensor; public double getCurrentTemperature() { return switch (sensor) { case TemperatureSensor t -> t.reading(); case HumiditySensor h -> h.reading() * 0.9; // apply a 10% moisture correction default -> 0.0; // in case of an unhandled sensor type, return 0 }; }
}
`
在这里,我们可以看到 Sensor 接口用于选择器表达式,并且 case 标签使用基于特定 Sensor 实现的模式:TemperatureSensor 和 HumiditySensor。这允许在 switch 语句中以更简洁和可读的方式处理不同类型的数据。
使用 switch 进行模式匹配的另一个用例是处理枚举。在引入模式匹配之前,枚举只能用作 case 标签中的常量,从而限制了可以在 switch 语句中测试的值。借助新功能,枚举现在可以在 case 标签中进行限定,从而实现更精确和灵活的匹配。
公共枚举方向 {
北,
东,
南,
西
}
public void move(方向方向) {
切换(方向){
案例北,北西,北东 ->向上移动();
情况 EAST、EAST_NORTH、EAST_SOUTH ->右移();
案例南,南_东,南_西->向下移动();
案例西、西_北、西_南 -> moveLeft();
}
}
这里,move() 方法使用 switch 语句来根据指定的 Direction 枚举值轻松处理不同方向的移动。通过模式匹配,我们还可以指定方向组合,例如 NORTH_WEST 和 EAST_SOUTH,使我们的代码更加健壮和灵活。
最后,让我们看一个示例,了解模式匹配如何帮助 switch 语句中的错误处理。在传统的 switch 中,如果选择器表达式与任何 case 标签都不匹配,则可以使用默认 case 来处理错误。但是,在处理多个 case 标签时,这可能会很乏味,并且可能导致代码重复。在模式匹配中,如果没有任何 case 标签模式与选择器表达式匹配,则会引发异常,从而使错误处理更加统一且不易出错。
public String getPlanetaryObject(PlanetaryBody body) {
返回开关(主体){
case Planet p && p.getMass() > 1e29-> p.getName() + "是一个气态巨行星";
case Planet p && p.getMass() > 1e23-> p.getName() + "是一颗岩石行星";
case Star s && s.getLuminosity() > 1e32-> s.getName() + "是一颗明亮的星星";
case Star s && s.getLuminosity()
默认-> throw new MatchException(“无法确定行星物体的类型:” + body.getName());
};
}
在此示例中,getPlanetaryObject() 方法接受一个 PlanetaryBody 对象,该对象可以是行星或恒星。表壳标签中使用的图案考虑了其他条件,例如行星的质量或恒星的光度。如果没有任何模式匹配,则会引发 MatchException,从而使错误处理更加一致并防止任何潜在错误。
结论
switch 的模式匹配是近年来 Java 中引入的最重要的功能之一。它允许更灵活和简洁的控制流结构。
通过获得 Java SE 21 专业认证开发人员认证来升级您的 Java 技能。
以上是探索 Java 21 中 Switch 模式匹配的强大功能的详细内容。更多信息请关注PHP中文网其他相关文章!