Java 实例of模式匹配(Pattern Matching for instanceof)使用指南
Java 16 正式引入了 instanceof 模式匹配功能,它简化了类型检查和类型转换的写法。

基本语法
// 传统写法
if (obj instanceof String) {
String str = (String) obj;
System.out.println(str.length());
}
// 模式匹配写法(Java 16+)
if (obj instanceof String str) {
System.out.println(str.length());
}
核心特点
变量绑定
自动将对象转换为匹配的类型并绑定到变量:
public void process(Object obj) {
if (obj instanceof String s) {
System.out.println("字符串长度: " + s.length());
} else if (obj instanceof Integer i) {
System.out.println("整数值: " + (i * 2));
} else if (obj instanceof List<?> list) {
System.out.println("列表大小: " + list.size());
}
}
条件判断中的使用
// 可以结合 && 使用
if (obj instanceof String s && s.length() > 5) {
System.out.println("长字符串: " + s);
}
// 注意:不能与 || 直接使用
// 错误示例:
// if (obj instanceof String s || s.length() > 5) { } // 编译错误
嵌套使用
class Shape { }
class Circle extends Shape {
double radius;
Circle(double radius) { this.radius = radius; }
}
class Rectangle extends Shape {
double width, height;
Rectangle(double w, double h) { this.width = w; this.height = h; }
}
public void printArea(Shape shape) {
if (shape instanceof Circle c) {
System.out.println("圆面积: " + Math.PI * c.radius * c.radius);
} else if (shape instanceof Rectangle r) {
System.out.println("矩形面积: " + r.width * r.height);
}
}
在 switch 表达式中使用(Java 17+)
public String describe(Object obj) {
return switch (obj) {
case Integer i -> "整数: " + i;
case String s -> "字符串: " + s;
case Long l -> "长整数: " + l;
case null -> "空值";
default -> "未知类型";
};
}
实际应用示例
示例1:简化 equals() 方法
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
// 传统写法
// if (obj instanceof Person) {
// Person other = (Person) obj;
// return name.equals(other.name) && age == other.age;
// }
// return false;
// 模式匹配写法
return obj instanceof Person other
&& name.equals(other.name)
&& age == other.age;
}
}
示例2:处理不同类型的数据
import java.util.*;
public class DataProcessor {
public String processData(Object data) {
// 传统写法
// if (data instanceof Map) {
// Map<String, Object> map = (Map<String, Object>) data;
// return "Map with " + map.size() + " entries";
// } else if (data instanceof List) {
// List<?> list = (List<?>) data;
// return "List with " + list.size() + " items";
// }
// 模式匹配写法
if (data instanceof Map<?, ?> map) {
return "Map with " + map.size() + " entries";
} else if (data instanceof Collection<?> coll) {
return "Collection with " + coll.size() + " items";
} else if (data instanceof String s && !s.isEmpty()) {
return "String: '" + s + "'";
}
return "Unknown data type";
}
}
注意事项
- 变量作用域:模式变量只在匹配成功的代码块中可用
- 不能与 || 混用:模式变量不能在 || 连接的表达式中使用
- 命名冲突:避免与外部变量同名
- 性能优化:编译器会优化模式匹配,性能优于传统写法
兼容性要求
- 需要 Java 16 或更高版本
- 需要在
pom.xml中配置:<properties> <maven.compiler.source>16</maven.compiler.source> <maven.compiler.target>16</maven.compiler.target> </properties>
模式匹配让代码更简洁、易读,减少了类型转换的样板代码。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播