Java模式匹配实战:5个现代类型处理技巧
1. instanceof模式匹配
简化类型检查和转换:
// 传统写法
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
// Java14+模式匹配写法
if (obj instanceof String s) {
System.out.println(s.length()); // s自动转换为String类型
// 还可以在同一作用域继续使用s
}
2. switch表达式模式匹配
类型安全的switch处理:
// Java17+ switch模式匹配
String format(Object o) {
return switch (o) {
case Integer i -> String.format("整数: %d", i);
case Double d -> String.format("浮点数: %f", d);
case String s -> String.format("字符串: %s", s);
case null -> "空值";
default -> o.toString();
};
}
// 使用
System.out.println(format(42)); // 整数: 42
System.out.println(format(3.14)); // 浮点数: 3.140000
System.out.println(format("Java")); // 字符串: Java
3. 记录类(Record)模式匹配
解构Record对象:
record Point(int x, int y) {}
String checkPoint(Object obj) {
return switch (obj) {
case Point(int x, int y) when x == y -> "点在y=x线上";
case Point(int x, int y) when x > y -> "点在y=x线下方";
case Point(int x, int y) -> "点在y=x线上方";
default -> "不是点";
};
}
// 使用
System.out.println(checkPoint(new Point(3, 3))); // 点在y=x线上
System.out.println(checkPoint(new Point(5, 2))); // 点在y=x线下方
4. 嵌套模式匹配
处理复杂数据结构:
record Address(String city, String street) {}
record User(String name, Address address) {}
String getUserCity(User user) {
if (user instanceof User(var name, Address(var city, _))) {
return name + " 居住在 " + city;
}
return "未知地址";
}
// 使用
User user = new User("张三", new Address("北京", "长安街"));
System.out.println(getUserCity(user)); // 张三 居住在北京
特性 | 传统方式 | 模式匹配 |
---|---|---|
代码简洁性 | 冗长 | 简洁 |
类型安全 | 易出错 | 编译器检查 |
可读性 | 一般 | 优秀 |
5. 电商实战:订单处理系统
使用模式匹配处理多种订单类型:
sealed interface Order permits PhysicalOrder, DigitalOrder, ServiceOrder {
String orderId();
BigDecimal amount();
}
record PhysicalOrder(String orderId, BigDecimal amount,
String address) implements Order {}
record DigitalOrder(String orderId, BigDecimal amount,
String downloadUrl) implements Order {}
record ServiceOrder(String orderId, BigDecimal amount,
LocalDate serviceDate) implements Order {}
class OrderProcessor {
void process(Order order) {
switch (order) {
case PhysicalOrder(var id, var amt, var addr) ->
shipPhysicalProduct(addr);
case DigitalOrder(var id, var amt, var url) ->
sendDownloadLink(url);
case ServiceOrder(var id, var amt, var date) ->
scheduleService(date);
}
}
private void shipPhysicalProduct(String address) {
System.out.println("发货到: " + address);
}
// 其他方法...
}
Java模式匹配为类型处理带来了革命性的改进,特别适合处理复杂对象结构、实现访问者模式等场景,能大幅提升代码的安全性和可维护性。