Java 21模式匹配:编写更简洁、更安全的条件逻辑

Java 21的模式匹配功能彻底改变了我们处理条件分支的方式。通过将类型检查、类型转换和变量绑定合并为单个操作,这项特性显著减少了样板代码,同时提高了代码的可读性和安全性

核心内容

1. 传统方式的局限性

在Java 21之前,处理多类型条件需要冗长的instanceof和显式类型转换:

1
2
3
4
5
6
7
8
// 传统方式:冗长且容易出错
if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
} else if (obj instanceof Integer) {
    Integer i = (Integer) obj;
    System.out.println(i * 2);
}

2. 模式匹配的解决方案

Java 21引入的模式匹配将类型检查和转换合二为一:

1
2
3
4
5
6
// 现代方式:简洁且安全
if (obj instanceof String s) {
    System.out.println(s.length());
} else if (obj instanceof Integer i) {
    System.out.println(i * 2);
}

3. Switch模式匹配

Java 21进一步扩展了模式匹配到switch表达式:

1
2
3
4
5
6
7
8
String formatter(Object obj) {
    return switch (obj) {
        case Integer i -> String.format("int %d", i);
        case String s -> String.format("String %s", s);
        case null -> "null";
        default -> obj.toString();
    };
}

最佳实践

1. 记录模式匹配

结合记录类使用模式匹配,实现优雅的数据解构:

1
2
3
4
5
6
7
record Point(int x, int y) {}

void process(Point p) {
    if (p instanceof Point(int x, int y)) {
        System.out.println("x: " + x + ", y: " + y);
    }
}

2. 防护模式

使用when子句添加额外的条件检查:

1
2
3
4
5
6
7
8
String classify(Object obj) {
    return switch (obj) {
        case String s when s.length() > 10 -> "长字符串";
        case String s -> "短字符串";
        case Integer i when i > 0 -> "正整数";
        default -> "其他";
    };
}

性能考虑

  • 模式匹配在编译时进行优化,运行时性能与传统方式相当
  • JVM会优化类型检查流程,避免不必要的开销
  • 对于性能敏感场景,建议进行基准测试

模式匹配概念

本博客已稳定运行
共14篇文章 · 共8.03k字
使用 Hugo 构建
主题 StackJimmy 设计 由 iTang 优化