在Java18之前,模式匹配只能使用在if语句中,而在Java18及更高版本中,switch语句支持类型模式的匹配。这意味着开发者可以直接在case标签中匹配对象的类型,而无需在case语句内部进行显式的类型检查和转换。例如,可以直接匹配并处理Integer、String等类型的对象。
模式匹配
Java17中if语句中使用模式匹配:
package com.morris.java21;
/**
* 模式匹配
*/
public class Switch17Demo {
public static String formatter(Object o) {
String formatted = "unknown";
if (o instanceof Integer i) {
formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
formatted = String.format("double %f", d);
} else if (o instanceof String s) {
formatted = String.format("String %s", s);
}
return formatted;
}
}
switch模式匹配
在Java18中,可以通过switch模式对上面的代码进行改进:
package com.morris.java21;
/**
* switch模式匹配
*/
public class Switch21Demo {
public static String formatter(Object o) {
return switch (o) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> o.toString();
};
}
}
case中判断null
switch可以和null进行结合判断:
public static void testCaseNull(String s) {
switch (s) {
case null -> System.out.println("null");
case "Morris", "Juan" -> System.out.println("MJ");
default -> System.out.println("Ok");
}
}
case中使用复杂表达式
case时可以加入复杂表达式:
static void testCaseExpression(Object o) {
switch (o) {
case String s when s.equalsIgnoreCase("YES") -> System.out.println("You got it");
case String s when s.equalsIgnoreCase("NO") -> System.out.println("Shame");
default -> System.out.println("Sorry?");
}
}
switch中使用密封类
case时可以进行密封类类型判断:
static sealed interface S permits A, B, C {
}
static final class A implements S {
}
static final class B implements S {
}
static record C(int i) implements S {
} // Implicitly final
public static int testSealed(S s) {
return switch (s) {
case A a -> 1;
case B b -> 2;
case C(int i) -> i;
};
}