switch 一直以来都只是一个语句,并不会生成结果。 JDK 14 使得 switch 还可以作为 一个表达式来使用,因此它可以得到一个值:
SwitchExpression.java
public class SwitchExpression {
static int colon(String s) {
var result = switch (s) {
case "i":
yield 1;
case "j":
yield 2;
case "k":
yield 3;
default:
yield 0;
};
return result;
}
static int arrow(String s) {
var result = switch (s) {
case "i" -> 1;
case "j" -> 2;
case "k" -> 3;
default -> 0;
};
return result;
}
public static void main(String[] args) {
for (var s : new String[]{"i", "j", "k", "z"}) {
System.out.format("%s %d %d%n", s, colon(s), arrow(s));
}
}
}
运行结果如下:
如 colon() 中所示,在使用旧的冒号语法的同时,可以使用新的 yield 关键字从 switch中 返回结果。注意在使用 yield 的时候,并不需要用到 break ——实际上如果加上了 break,反而会在编译时产生错误消息“试图跳出switch表达式”(attempt to break out of a switch expression)。
如果试图在 switch 语句中使用 yield,编译器会产生错误消息“在 switch 表达式外部 yield ”(yield out side of switch expression)。
arrow() 会产生和 colon() 相同的效果,但是要注意这样的语法会更清晰、更紧凑,也更易读。可以看看这种方式为 TrafficLight.java 带来的改进(相较于在本章前面实现的版本):
EnumSwitch.java
public class EnumSwitch {
enum Signal {GREEN, YELLOW, RED,}
Signal color = Signal.RED;
public void change() {
color = switch (color) {
case RED -> Signal.GREEN;
case GREEN -> Signal.YELLOW;
case YELLOW -> Signal.RED;
};
}
}
同样,如果在不加上 case BLUE 的情况下将 BLUE 加入到 enum Signal 中,Java的反应则是“switch 表达式并未覆盖所有可能的输人值”(the switch expression does not cover all possible input values)。编译器会确保在修改代码的时候不会缺少case。
如果一个case需要多个语句或表达式,那就将它们放在一对花括号中。
Planets.java
enum CelestialBody {
MERCURY, VENUS, EARTH, MARS, JUPITER,
SATURN, URANUS, NEPTUNE, PLUTO
}
public class Planets {
public static String classify(CelestialBody b) {
var result = switch (b) {
case MERCURY, VENUS, EARTH,
MARS, JUPITER,
SATURN, URANUS, NEPTUNE -> {
System.out.print("A planet: ");
yield b.toString();
}
case PLUTO -> {
System.out.print("Not a planet: ");
yield b.toString();
}
};
return result;
}
public static void main(String[] args) {
System.out.println(classify(CelestialBody.MARS));
System.out.println(classify(CelestialBody.PLUTO));
}
}
运行结果如下:文章来源:https://www.toymoban.com/news/detail-515381.html
A planet: MARS
Not a planet: PLUTO
注意,在从多行代码组成的 case 表达式中生成结果时,即便使用了箭头语法,也要使用 yield。文章来源地址https://www.toymoban.com/news/detail-515381.html
到了这里,关于一、枚举类型——新特性(将 switch 作为表达式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!