Java 25 模式匹配增强:让代码更简洁优雅
Java 25 模式匹配增强让代码更简洁优雅今天我们来聊聊 Java 25 中模式匹配的增强特性这是让 Java 代码更加简洁优雅的重要进化。一、模式匹配的发展历程模式匹配Pattern Matching是 Java 语言近年来最重要的特性之一。从 Java 16 的 instanceof 模式匹配到 Java 17 的 switch 模式匹配再到 Java 21 的记录模式Java 的模式匹配能力在不断完善。Java 25 在此基础上进一步增强了模式匹配的能力让我们能够写出更加简洁、可读性更强的代码。二、Java 25 模式匹配的核心增强1. 记录模式的完善记录模式Record Patterns在 Java 25 中得到了进一步增强// 定义记录publicrecordPoint(intx,inty){}publicrecordColoredPoint(Pointpoint,Stringcolor){}// 使用记录模式进行解构publicStringdescribe(Objectobj){returnswitch(obj){casePoint(intx,inty)-Point at (x, y);caseColoredPoint(Point(varpx,varpy),varcolor)-Colored point at (px, py) with color color;default-Unknown object;};}这其实可以更优雅一点我们还可以使用嵌套模式publicdoublecalculateArea(Objectshape){returnswitch(shape){caseRectangle(Point(varx1,vary1),Point(varx2,vary2))-Math.abs((x2-x1)*(y2-y1));caseCircle(Point(varcx,varcy),varradius)-Math.PI*radius*radius;caseTriangle(Point(varx1,vary1),Point(varx2,vary2),Point(varx3,vary3))-{doubleadistance(x1,y1,x2,y2);doublebdistance(x2,y2,x3,y3);doublecdistance(x3,y3,x1,y1);doubles(abc)/2;yieldMath.sqrt(s*(s-a)*(s-b)*(s-c));}default-thrownewIllegalArgumentException(Unknown shape);};}2. 数组模式匹配Java 25 引入了对数组的模式匹配支持publicStringanalyzeArray(int[]arr){returnswitch(arr){casenull-Null array;caseint[]a when a.length0-Empty array;caseint[]a when a.length1-Single element: a[0];caseint[]a when a.length2-Two elements: a[0], a[1];caseint[]a-Array with a.length elements;};}3. 泛型模式匹配Java 25 增强了泛型的模式匹配能力publicTStringprocessContainer(ContainerTcontainer){returnswitch(container){caseContainerString(varvalue)when value.length()10-Long string: value.substring(0,10)...;caseContainerString(varvalue)-String: value;caseContainerInteger(varvalue)when value100-Large number: value;caseContainerInteger(varvalue)-Number: value;caseContainer?(varvalue)-Unknown type: value;};}三、模式匹配与 switch 表达式的结合1. 守卫模式Guarded PatternsJava 25 进一步完善了守卫模式让我们可以在模式匹配中添加更复杂的条件publicStringclassifyNumber(Integern){returnswitch(n){casenull-Null;caseIntegeri when i0-Negative;caseIntegeri when i0-Zero;caseIntegeri when i0i10-Small positive;caseIntegeri when i10i100-Medium positive;caseIntegeri when i100-Large positive;default-Unknown;// 理论上不会到达这里};}2. 穷尽性检查Java 25 的编译器能够更好地进行穷尽性检查// 密封类publicsealedinterfaceShapepermitsCircle,Rectangle,Triangle{}publicrecordCircle(doubleradius)implementsShape{}publicrecordRectangle(doublewidth,doubleheight)implementsShape{}publicrecordTriangle(doublebase,doubleheight)implementsShape{}// 编译器会检查是否覆盖了所有情况publicdoublearea(Shapeshape){returnswitch(shape){caseCircle(varr)-Math.PI*r*r;caseRectangle(varw,varh)-w*h;caseTriangle(varb,varh)-0.5*b*h;// 不需要 default因为已经穷尽了所有情况};}四、实践案例表达式求值器让我们通过一个实际的例子来展示模式匹配的强大能力// 定义表达式层次结构publicsealedinterfaceExprpermitsConstant,Variable,Add,Subtract,Multiply,Divide{}publicrecordConstant(doublevalue)implementsExpr{}publicrecordVariable(Stringname)implementsExpr{}publicrecordAdd(Exprleft,Exprright)implementsExpr{}publicrecordSubtract(Exprleft,Exprright)implementsExpr{}publicrecordMultiply(Exprleft,Exprright)implementsExpr{}publicrecordDivide(Exprleft,Exprright)implementsExpr{}// 表达式求值publicclassEvaluator{privatefinalMapString,Doublevariables;publicEvaluator(MapString,Doublevariables){this.variablesvariables;}publicdoubleevaluate(Exprexpr){returnswitch(expr){caseConstant(varvalue)-value;caseVariable(varname)-variables.getOrDefault(name,0.0);caseAdd(varleft,varright)-evaluate(left)evaluate(right);caseSubtract(varleft,varright)-evaluate(left)-evaluate(right);caseMultiply(varleft,varright)-evaluate(left)*evaluate(right);caseDivide(varleft,varright)-{doubledivisorevaluate(right);if(divisor0){thrownewArithmeticException(Division by zero);}yieldevaluate(left)/divisor;}};}// 表达式简化publicExprsimplify(Exprexpr){returnswitch(expr){caseAdd(varleft,varright)-{ExprsimplifiedLeftsimplify(left);ExprsimplifiedRightsimplify(right);// 0 x xif(simplifiedLeftinstanceofConstant(0.0)){yieldsimplifiedRight;}// x 0 xif(simplifiedRightinstanceofConstant(0.0)){yieldsimplifiedLeft;}// 常量相加if(simplifiedLeftinstanceofConstant(varv1)simplifiedRightinstanceofConstant(varv2)){yieldnewConstant(v1v2);}yieldnewAdd(simplifiedLeft,simplifiedRight);}caseMultiply(varleft,varright)-{ExprsimplifiedLeftsimplify(left);ExprsimplifiedRightsimplify(right);// 1 * x xif(simplifiedLeftinstanceofConstant(1.0)){yieldsimplifiedRight;}// x * 1 xif(simplifiedRightinstanceofConstant(1.0)){yieldsimplifiedLeft;}// 0 * x 0if(simplifiedLeftinstanceofConstant(0.0)||simplifiedRightinstanceofConstant(0.0)){yieldnewConstant(0.0);}yieldnewMultiply(simplifiedLeft,simplifiedRight);}default-expr;};}}五、模式匹配在实际开发中的应用1. 状态机实现publicsealedinterfaceStatepermitsIdle,Loading,Loaded,Error{}publicrecordIdle()implementsState{}publicrecordLoading(Stringurl)implementsState{}publicrecordLoaded(Stringcontent)implementsState{}publicrecordError(Stringmessage)implementsState{}publicclassStateMachine{privateStatecurrentStatenewIdle();publicvoidtransition(Eventevent){currentStateswitch(currentState){caseIdle()-switch(event){caseLoadEvent(varurl)-newLoading(url);default-currentState;};caseLoading(varurl)-switch(event){caseSuccessEvent(varcontent)-newLoaded(content);caseFailureEvent(varmsg)-newError(msg);default-currentState;};caseLoaded(varcontent)-switch(event){caseRefreshEvent()-newLoading(refresh);default-currentState;};caseError(varmsg)-switch(event){caseRetryEvent()-newLoading(retry);default-currentState;};};}}2. JSON 处理publicStringformatJson(JsonElementelement){returnswitch(element){caseJsonNull()-null;caseJsonPrimitive(varvalue)-value.toString();caseJsonArray(varelements)-elements.stream().map(this::formatJson).collect(Collectors.joining(, ,[,]));caseJsonObject(varmembers)-members.entrySet().stream().map(e-\e.getKey()\: formatJson(e.getValue())).collect(Collectors.joining(, ,{,}));};}六、总结与建议Java 25 的模式匹配增强让代码变得更加简洁、可读性更强。通过合理使用这些特性我们可以减少样板代码提高代码可读性增强类型安全简化复杂逻辑的处理这其实可以更优雅一点建议大家在以下场景优先考虑使用模式匹配类型判断和转换替代冗长的 instanceof 和强制类型转换数据结构解构处理记录、数组等复杂数据结构状态机实现清晰表达状态和转换表达式求值实现编译器、解释器等希望这篇文章能帮助你更好地理解和使用 Java 25 的模式匹配特性。欢迎在评论区分享你的使用心得或者提出你遇到的问题。