Java 中的 switch
语句是一种多分支选择结构,它允许基于不同的情况执行不同的代码块。通常结合break, default, case 等关键字一起使用。
switch (expression) {
case value1:
// 代码块
break; // 可选
case value2:
// 代码块
break; // 可选
// 可以有任意数量的case语句
default: // 可选
// 默认情况下的代码块
}
expression:这是一个必须的表达式,它的结果被用来与 case 语句中的值进行比较。这个表达式可以是 byte、short、char、int 类型,枚举(Java 5 开始支持),或者是 String 类型(Java 7 开始支持),
任意类型(Java 12).
case value:这是与 expression 结果进行匹配的值。如果匹配成功,紧随其后的代码块将被执行。
value 必须为一个常量表达式。 JAVA 12 开始支持类型推断。
JAVA 21 开始支持 when.
break:这是一个可选关键字,用来终止 switch 语句的执行。如果没有 break,程序将会继续执行下一个 case 中的代码,直到遇到 break 或者 switch 语句的结尾。
default:这也是一个可选部分,当没有任何 case 与 expression 的值匹配时,将执行 default 部分的代码。
示例:
final static class User{public String name;}
private static final char m = 'm';
private static final User user = new User();
static void switchSen(Object v) {
Character c = 1;
User u = new User();
switch(v) {
case Integer i: System.out.println(i);
break;
//case c: System.out.println(1);
//case 1: System.out.println(1);
case User us: System.out.println(us);
default:
System.out.println("default");
}
switch(c) {
case 2: System.out.println(2);
case m: System.out.println(m);
default:
System.out.println("default");
}
switch(u) {
case User i when u.name.equals("abc"): System.out.println(i);
// case user: System.out.println(2);
default:
System.out.println("default");
}
}
switch 表达式
在 Java 12 及以后的版本中,switch 可以用作表达式,这意味着它可以返回一个值。switch 表达式使用 -> 来代替case 后的 :. 另外每个case 不需要使用break , 只返回因为表达式是有返回值的,因此其中的case 必须涵盖传入表达式的所有值。
switch (expression) {
case value1 -> {
// 代码块
yield value; // 可选
}
case value2 -> value:
// 可以有任意数量的case语句
default -> default value // 可选
// 默认情况下的代码块
}
case value:这是与 expression 结果进行匹配的值。如果匹配成功,紧随其后的代码块将被执行。
value 必须为一个常量表达式。 JAVA 12 开始支持类型推断。
JAVA 21 开始支持 when.
示例:
static String switchWhen(Object v) {
//int when = 1;
//int yield = 3;//任然可以作为变量
return switch(v) {
case Integer i -> i.toString();
case String s when s.equalsIgnoreCase("yes") ->{
yield s.toUpperCase();
}
case String s when s.equalsIgnoreCase("yeap") -> "yep";
default -> "EMPTY";
};
}
static String switchNull(Object v) {
return switch(v) {
case Integer i -> i.toString();
case String s when s.equalsIgnoreCase("yes") ->{
yield s.toUpperCase();
}
case String s -> "NO";
case null,default -> "EMPTY";
};
}
static String switchString(CharSequence v) {
return switch(v) {
case String s -> "String";
case CharSequence s -> "CS";
// case String s when s.equalsIgnoreCase("yes") ->{
// yield s.toUpperCase();
// }
// default -> "EMPTY"; //前面两个case 已处理所有情况
};
}
为什么使用Switch
从使用语法可知,switch 能实现的功能,if else 也是能实现的,但使用switch 有以下几大优势:
可读性: 当你需要基于同一个变量的不同值来执行不同的代码块时,switch语句比多个if-else语句更加清晰和易读。
效率: 对于包含许多case的情况,switch语句通常比if-else语句更高效,因为switch语句可以转化为跳转表,这意味着不需要按顺序检查每个条件。
可维护性: 当需要修改或者增加新的条件分支时,switch语句的结构使得这些变更更加集中和简单。