在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 finalpublic static int testSealed(S s) {return switch (s) {case A a -> 1;case B b -> 2;case C(int i) -> i;};
}