当前位置: 首页 > 后端技术 > PHP

用“Function”消除if...else

时间:2023-03-30 03:46:42 PHP

在开发过程中,if...else...常用于判断抛出异常、分支处理等操作。这些if...else...充斥在代码中,严重影响了代码的美观。这时候我们可以使用Java8的Function接口来消除if...else....if(...){thrownewRuntimeException("Anexceptionoccurred");}if(...){doSomething();}else{doOther();}复制代码Function函数式接口用注解@FunctionalInterface来标记,只有一个抽象方法的接口是函数式接口。函数式接口主要分为Supplier供给函数、Consumer消费函数、无参无返回的Runnable函数、有参有返回的Function函数。Function可以看成是转换函数Supplier。供应商函数的表现形式是不接受参数,只返回数据。消费者消费函数。Consumer消费函数与Supplier正好相反。消费者接受一个参数,没有返回值。Runnable没有参数,也没有返回函数。Runnable没有参数,也没有返回值。函数函数接收一个参数并返回一个值。Supplier、Consumer、Runnable可以看作是Function的一种特殊形式。使用技巧来处理抛出的异常。定义一个函数,以抛出异常的形式来定义功能接口。该接口只有参数,没有返回值。它是一个供应接口/**抛出异常接口**/@FunctionalInterfacepublicinterfaceThrowExceptionFunction{/***抛出异常信息**@parammessage异常信息*@returnvoid**/voidthrowMessage(Stringmessage);}复制代码编写判断方法创建工具类VUtils,创建一个isTure方法,返回值为刚刚定义的函数式接口——ThrowExceptionFunction。ThrowExceptionFunction的接口实现逻辑是参数b为真时抛出异常/**参数为真时抛出异常@paramb@returncom.example.demo.func.ThrowExceptionFunction**/publicstaticThrowExceptionFunctionisTure(布尔b){return(errorMessage)->{if(b){thrownewRuntimeException(errorMessage);}};}复制代码用法调用工具类参数参数后,调用功能接口的throwMessage方法传入异常消息。当输入输出参数为false时,正常执行。当输入和输出参数为真时,抛出异常。如果分支操作定义了一个函数式接口创建一个函数式接口,名称为BranchHandle,该接口的参数为两个Runnable接口。这两个Runnable接口分别代表为true或false时执行的操作/**分支处理接口**/@FunctionalInterfacepublicinterfaceBranchHandle{/***分支操作**@paramtrueHandle为true时执行Operation*@paramfalseHandlefalse时要执行的操作*@returnvoid**/voidtrueOrFalseHandle(RunnabletrueHandle,RunnablefalseHandle);}复制代码,写判断方法,创建一个名为isTureOrFalse的方法,返回值方法只是定义了BranchHandle的功能接口。/**当参数为true或false时,分别执行不同的操作@paramb@returncom.example.demo.func.BranchHandle**/publicstaticBranchHandleisTureOrFalse(booleanb){return(trueHandle,falseHandle)->{如果(b){trueHandle.run();}else{falseHandle.run();}};}复制代码当usage参数为true时,执行trueHandle当参数为false时,执行falseHandle如果有值,执行消费操作,否则执行基于空的操作定义函数,创建一个名为PresentOrElseHandler的功能接口,接口的参数之一是Consumer接口。一种是Runnable,分别表示值不为空时的消费操作和值为空时的其他操作/**null和非null值的分支处理*/publicinterfacePresentOrElseHandler{/***value不为空时执行消费操作*value为空时执行其他操作**@paramactionvalue不为空时执行消费操作*@paramemptyActionvalue为空时执行操作*@returnvoid**/voidpresentOrElseHandle(Consumeraction,RunnableemptyAction);}复制代码,写判断方法,创建方法名为isBlankOrNoBlank。该方法的返回值是刚刚定义的功能接口——PresentOrElseHandler。/**当参数为true或false时,分别执行不同的操作*@paramb@returncom.example.demo.func.BranchHandle**/publicstaticPresentOrElseHandlerisBlankOrNoBlank(Stringstr){return(consumer,runnable)->{如果(str==null||str.length()==0){runnable.run();}else{consumer.accept(str);参数之后,调用函数式接口的presentOrElseHandle方法,传入一个Consumer和Runnable。简化您的代码。如果您觉得这篇文章对您有用,请给我们的开源项目点个star:http://github.crmeb.net/u/defu非常感谢!