Java 25 模式匹配进阶让代码更简洁优雅别叫我大神叫我 Alex 就好。今天我们来聊聊 Java 25 中模式匹配的进阶特性这是让 Java 代码更加简洁优雅的重要进化。一、模式匹配的发展历程模式匹配Pattern Matching是 Java 语言近年来最重要的特性之一。从 Java 16 的 instanceof 模式匹配到 Java 17 的 switch 模式匹配再到 Java 21 的记录模式Java 的模式匹配能力在不断完善。Java 25 在此基础上进一步增强了模式匹配的能力让我们能够写出更加简洁、可读性更强的代码。二、Java 25 模式匹配的核心增强1. 记录模式的完善记录模式Record Patterns在 Java 25 中得到了进一步增强// 定义记录 public record Point(int x, int y) {} public record ColoredPoint(Point point, String color) {} public record Line(ColoredPoint start, ColoredPoint end) {} // 使用嵌套记录模式 public String describeShape(Object shape) { return switch (shape) { case Point(int x, int y) - Point at ( x , y ); case ColoredPoint(Point(int px, int py), String color) - Colored point at ( px , py ) with color color; case Line(ColoredPoint(Point(int x1, int y1), var c1), ColoredPoint(Point(int x2, int y2), var c2)) - Line from ( x1 , y1 ) to ( x2 , y2 ); default - Unknown shape; }; }2. 数组模式的增强Java 25 增强了对数组的模式匹配支持public String analyzeArray(Object obj) { return switch (obj) { case null - Null object; case int[] arr when arr.length 0 - Empty int array; case int[] arr when arr.length 1 - Single element int array: arr[0]; case int[] arr - Int array with arr.length elements; case String[] arr when arr.length 0 - Empty string array; case String[] arr - String array with arr.length elements; case Object[] arr - Object array with arr.length elements; default - Not an array; }; }3. 泛型模式的支持Java 25 增强了泛型的模式匹配能力public T String processContainer(ContainerT container) { return switch (container) { case ContainerString(String value) when value.length() 10 - Long string: value.substring(0, 10) ...; case ContainerString(String value) - String: value; case ContainerInteger(Integer value) when value 100 - Large number: value; case ContainerInteger(Integer value) - Number: value; case ContainerList?(List? list) when list.isEmpty() - Empty list; case ContainerList?(List? list) - List with list.size() elements; default - Unknown container; }; }三、模式匹配与 switch 表达式的深度结合1. 守卫模式的增强Java 25 进一步完善了守卫模式让我们可以在模式匹配中添加更复杂的条件public String classifyNumber(Object obj) { return switch (obj) { case null - Null; case Integer i when i 0 - Negative integer: i; case Integer i when i 0 - Zero; case Integer i when i 0 i 10 - Small positive integer: i; case Integer i when i 10 i 100 - Medium positive integer: i; case Integer i - Large positive integer: i; case Double d when d 0 - Negative double: d; case Double d when d 0 - Zero double; case Double d - Positive double: d; default - Not a number; }; }2. 穷尽性检查的改进Java 25 的编译器能够更好地进行穷尽性检查// 密封类层次结构 public sealed interface Expression permits Constant, Variable, Add, Subtract, Multiply, Divide {} public record Constant(double value) implements Expression {} public record Variable(String name) implements Expression {} public record Add(Expression left, Expression right) implements Expression {} public record Subtract(Expression left, Expression right) implements Expression {} public record Multiply(Expression left, Expression right) implements Expression {} public record Divide(Expression left, Expression right) implements Expression {} // 编译器会检查是否覆盖了所有情况 public double evaluate(Expression expr) { return switch (expr) { case Constant(double value) - value; case Variable(String name) - getVariableValue(name); case Add(Expression left, Expression right) - evaluate(left) evaluate(right); case Subtract(Expression left, Expression right) - evaluate(left) - evaluate(right); case Multiply(Expression left, Expression right) - evaluate(left) * evaluate(right); case Divide(Expression left, Expression right) - { double divisor evaluate(right); if (divisor 0) { throw new ArithmeticException(Division by zero); } yield evaluate(left) / divisor; } // 不需要 default因为已经穷尽了所有情况 }; }四、模式匹配在实际开发中的应用1. 状态机实现// 状态定义 public sealed interface State permits Idle, Loading, Loaded, Error {} public record Idle() implements State {} public record Loading(String resource) implements State {} public record Loaded(String content) implements State {} public record Error(String message) implements State {} // 事件定义 public sealed interface Event permits LoadEvent, SuccessEvent, FailureEvent, RetryEvent {} public record LoadEvent(String resource) implements Event {} public record SuccessEvent(String content) implements Event {} public record FailureEvent(String message) implements Event {} public record RetryEvent() implements Event {} // 状态机实现 public class StateMachine { private State currentState new Idle(); public void processEvent(Event event) { currentState switch (currentState) { case Idle() - switch (event) { case LoadEvent(String resource) - new Loading(resource); default - currentState; }; case Loading(String resource) - switch (event) { case SuccessEvent(String content) - new Loaded(content); case FailureEvent(String message) - new Error(message); default - currentState; }; case Loaded(String content) - switch (event) { case LoadEvent(String resource) - new Loading(resource); default - currentState; }; case Error(String message) - switch (event) { case RetryEvent() - new Idle(); case LoadEvent(String resource) - new Loading(resource); default - currentState; }; }; System.out.println(Transitioned to: currentState); } }2. JSON 处理// 简化的 JSON 节点层次结构 public sealed interface JsonNode permits JsonNull, JsonBoolean, JsonNumber, JsonString, JsonArray, JsonObject {} public record JsonNull() implements JsonNode {} public record JsonBoolean(boolean value) implements JsonNode {} public record JsonNumber(double value) implements JsonNode {} public record JsonString(String value) implements JsonNode {} public record JsonArray(ListJsonNode elements) implements JsonNode {} public record JsonObject(MapString, JsonNode members) implements JsonNode {} // JSON 处理 public class JsonProcessor { public String formatJson(JsonNode node) { return switch (node) { case JsonNull() - null; case JsonBoolean(boolean value) - String.valueOf(value); case JsonNumber(double value) - String.valueOf(value); case JsonString(String value) - \ value \; case JsonArray(ListJsonNode elements) - elements.stream() .map(this::formatJson) .collect(Collectors.joining(, , [, ])); case JsonObject(MapString, JsonNode members) - members.entrySet().stream() .map(entry - \ entry.getKey() \: formatJson(entry.getValue())) .collect(Collectors.joining(, , {, })); }; } public JsonNode parse(String json) { // 简化的 JSON 解析实现 // 实际应用中应使用成熟的 JSON 库 return new JsonNull(); } }3. 命令模式实现// 命令接口 public sealed interface Command permits CreateUserCommand, UpdateUserCommand, DeleteUserCommand, ListUsersCommand {} public record CreateUserCommand(String username, String email) implements Command {} public record UpdateUserCommand(long id, String username, String email) implements Command {} public record DeleteUserCommand(long id) implements Command {} public record ListUsersCommand(int page, int size) implements Command {} // 命令处理器 public class CommandHandler { private final UserRepository userRepository; public CommandHandler(UserRepository userRepository) { this.userRepository userRepository; } public Object handleCommand(Command command) { return switch (command) { case CreateUserCommand(String username, String email) - { User user new User(username, email); userRepository.save(user); yield user; }; case UpdateUserCommand(long id, String username, String email) - { User user userRepository.findById(id) .orElseThrow(() - new UserNotFoundException(id)); user.setUsername(username); user.setEmail(email); userRepository.save(user); yield user; }; case DeleteUserCommand(long id) - { userRepository.deleteById(id); yield User deleted successfully; }; case ListUsersCommand(int page, int size) - { return userRepository.findAll(PageRequest.of(page, size)); }; }; } }五、性能优化1. 模式匹配的性能Java 25 对模式匹配的性能进行了优化特别是在 switch 表达式中// 性能测试 public class PatternMatchingPerformance { public static void main(String[] args) { long start System.nanoTime(); for (int i 0; i 1_000_000; i) { Object obj i % 3 0 ? new Point(i, i) : i % 3 1 ? new ColoredPoint(new Point(i, i), red) : new Line(new ColoredPoint(new Point(i, i), red), new ColoredPoint(new Point(i1, i1), blue)); String result describeShape(obj); } long end System.nanoTime(); System.out.println(Pattern matching took: (end - start) / 1_000_000 ms); } }2. 最佳实践使用模式匹配替代 instanceof 类型转换在复杂的类型层次结构中使用密封类合理使用守卫模式处理复杂条件优先使用记录模式处理数据类六、总结与建议Java 25 的模式匹配增强让代码变得更加简洁、可读性更强。通过合理使用这些特性我们可以减少样板代码提高代码可读性增强类型安全简化复杂逻辑的处理这其实可以更优雅一点建议大家在以下场景优先考虑使用模式匹配类型判断和转换替代冗长的 instanceof 和强制类型转换数据结构解构处理记录、数组等复杂数据结构状态机实现清晰表达状态和转换表达式求值实现编译器、解释器等命令模式处理不同类型的命令别叫我大神叫我 Alex 就好。希望这篇文章能帮助你更好地理解和使用 Java 25 的模式匹配特性。欢迎在评论区分享你的使用心得或者提出你遇到的问题。