0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用Java 8的Function接口来消灭if...else

Android编程精选 来源:juejin.cn/post/ 作者:juejin.cn/post/ 2022-04-21 10:23 次阅读

在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8Function接口来消灭if...else...

if(...){
thrownewRuntimeException("出现异常了");
}

if(...){
doSomething();
}else{
doOther();
}

Function 函数式接口

使用注解@FunctionalInterface标识,并且只包含一个抽象方法的接口是函数式接口函数式接口主要分为Supplier供给型函数、Consumer消费型函数、Runnable无参无返回型函数和Function有参有返回型函数。

Function可以看作转换型函数

Supplier供给型函数

Supplier的表现形式为不接受参数、只返回数据

9f6cb94c-c09e-11ec-bce3-dac502259ad0.jpg

Consumer消费型函数

Consumer消费型函数和Supplier刚好相反。Consumer接收一个参数,没有返回值

9f7e14da-c09e-11ec-bce3-dac502259ad0.jpg

Runnable无参无返回型函数

Runnable的表现形式为即没有参数也没有返回值

9f8fdaa8-c09e-11ec-bce3-dac502259ad0.jpg

Function函数的表现形式为接收一个参数,并返回一个值。SupplierConsumerRunnable可以看作Function的一种特殊表现形式

9fa29756-c09e-11ec-bce3-dac502259ad0.jpg

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

使用小技巧

处理抛出异常的if

  1. 定义函数

定义一个抛出异常的形式的函数式接口, 这个接口只有参数没有返回值是个消费型接口

/**
*抛异常接口
**/
@FunctionalInterface
publicinterfaceThrowExceptionFunction{

/**
*抛出异常信息
*
*@parammessage异常信息
*@returnvoid
**/
voidthrowMessage(Stringmessage);
}
  1. 编写判断方法

创建工具类VUtils并创建一个isTure方法,方法的返回值为刚才定义的函数式接口-ThrowExceptionFunctionThrowExceptionFunction的接口实现逻辑为当参数btrue时抛出异常

/**
*如果参数为true抛出异常
*
*@paramb
*@returncom.example.demo.func.ThrowExceptionFunction
**/
publicstaticThrowExceptionFunctionisTure(booleanb){

return(errorMessage)->{
if(b){
thrownewRuntimeException(errorMessage);
}
};
}
  1. 使用方式

调用工具类参数参数后,调用函数式接口throwMessage方法传入异常信息。当出入的参数为false时正常执行

9fb69030-c09e-11ec-bce3-dac502259ad0.jpg

当出入的参数为true时抛出异常

9fc77472-c09e-11ec-bce3-dac502259ad0.jpg

处理if分支操作

  1. 定义函数式接口

创建一个名为BranchHandle的函数式接口,接口的参数为两个Runnable接口。这两个两个Runnable接口分别代表了为truefalse时要进行的操作

/**
*分支处理接口
**/
@FunctionalInterface
publicinterfaceBranchHandle{

/**
*分支操作
*
*@paramtrueHandle为true时要进行的操作
*@paramfalseHandle为false时要进行的操作
*@returnvoid
**/
voidtrueOrFalseHandle(RunnabletrueHandle,RunnablefalseHandle);

}
  1. 编写判断方法

创建一个名为isTureOrFalse的方法,方法的返回值为刚才定义的函数式接口-BranchHandle

/**
*参数为true或false时,分别进行不同的操作
*
*@paramb
*@returncom.example.demo.func.BranchHandle
**/
publicstaticBranchHandleisTureOrFalse(booleanb){

return(trueHandle,falseHandle)->{
if(b){
trueHandle.run();
}else{
falseHandle.run();
}
};
}
  1. 使用方式

参数为true时,执行trueHandle

9fda6e06-c09e-11ec-bce3-dac502259ad0.jpg

参数为false时,执行falseHandle

9fe64ef6-c09e-11ec-bce3-dac502259ad0.jpg

如果存在值执行消费操作,否则执行基于空的操作

  1. 定义函数

创建一个名为PresentOrElseHandler的函数式接口,接口的参数一个为Consumer接口。一个为Runnable,分别代表值不为空时执行消费操作和值为空时执行的其他操作

/**
*空值与非空值分支处理
*/
publicinterfacePresentOrElseHandler<TextendsObject>{

/**
*值不为空时执行消费操作
*值为空时执行其他的操作
*
*@paramaction值不为空时,执行的消费操作
*@paramemptyAction值为空时,执行的操作
*@returnvoid
**/
voidpresentOrElseHandle(ConsumersuperT>action,RunnableemptyAction);

}
  1. 编写判断方法

创建一个名为isBlankOrNoBlank的方法,方法的返回值为刚才定义的函数式接口-PresentOrElseHandler

/**
*参数为true或false时,分别进行不同的操作
*
*@paramb
*@returncom.example.demo.func.BranchHandle
**/
publicstaticPresentOrElseHandlerisBlankOrNoBlank(Stringstr){

return(consumer,runnable)->{
if(str==null||str.length()==0){
runnable.run();
}else{
consumer.accept(str);
}
};
}
  1. 使用方式

调用工具类参数参数后,调用函数式接口presentOrElseHandle方法传入一个ConsumerRunnable

参数不为空时,打印参数

9ff6e298-c09e-11ec-bce3-dac502259ad0.jpg

参数不为空时

-End-

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2903

    浏览量

    102974
  • 函数
    +关注

    关注

    3

    文章

    3859

    浏览量

    61295

原文标题:妙用Java8中的“Function”消灭if...else!

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    verilog task和function区别

    verilog中的task和function都是用于实现模块中的可重复的功能,并且可以接收参数和返回结果。但是它们在编写和使用上有一些区别。下面将详细介绍task和function的区别。 语法结构
    的头像 发表于 02-22 15:53 223次阅读

    java环境下如何使用hash函数

    Java环境下使用散列函数(hash function)是一种常见的操作。散列函数是将任意大小的数据转换为固定大小的输出值的函数。在Java中,散列函数经常用于数据结构中的键值对存储、字符串加密
    的头像 发表于 12-06 15:52 221次阅读

    java接口是特殊的抽象类吗

    Java接口是一种特殊的抽象类吗? 在Java编程语言中,接口(interface)与抽象类(abstract class)是两种不同的概念,尽管它们之间存在一些相似之处,但在设计和使
    的头像 发表于 11-21 10:07 255次阅读

    Java中抽象类和接口的介绍

    Java是一种面向对象的编程语言,提供了抽象类和接口两种机制来帮助开发人员组织和管理代码。本文将详细介绍Java语言中抽象类和接口的概念、特点、使用方式以及它们之间的区别和联系。 抽象
    的头像 发表于 11-21 09:47 219次阅读

    java接口和抽象类的区别

    Java中的接口(Interface)和抽象类(Abstract class)都是抽象的概念,它们可以用来定义类的行为和特征。虽然它们具有一些相似之处,但也存在一些重要的区别。本文将详尽介绍Java
    的头像 发表于 11-21 09:45 270次阅读

    妙用Java 8中的 Function接口消灭if...else(非常新颖的写法)

    使用注解@FunctionalInterface标识,并且只包含一个抽象方法的接口是函数式接口。函数式接口主要分为Supplier供给型函数、Consumer消费型函数、Runnable无参无返回型函数和
    的头像 发表于 11-10 16:23 184次阅读
    妙用<b class='flag-5'>Java</b> 8中的 <b class='flag-5'>Function</b><b class='flag-5'>接口</b>,<b class='flag-5'>消灭</b><b class='flag-5'>if...else</b>(非常新颖的写法)

    如何解决冗长的if...else条件判断(下)

    创建子类 接下来,我们将创建不同的类来表示不同的条件,每个类都会根据条件来执行execute()方法来做某些事。 class Cat ( Animal ): def execute ( self ): print ( "say miao~miao~!" ) class Dog ( Animal ): def execute ( self ): print ( "say wang~wang~!" ) class Pig ( Animal ): def execute ( self ): print ( "say hang~hang~!" ) 在这里我们会用到对象的其中一个特性:继承,我们继承的基类 Animal ,并且对 execute() 方法进行了重写. 构建实例 我们可以用一个字典或者工厂方法来实现通过一个支付类型来找到
    的头像 发表于 09-12 17:06 374次阅读

    如何解决冗长的if...else条件判断(上)

    if...else...条件语句我相信学习python的童鞋们都喜欢用,例如下一面这一段 def func ( param ): if param == "cat" : print ( "这是一只
    的头像 发表于 09-12 17:03 400次阅读

    详细分析消灭EMC三大利器的原理

    滤波电容器、共模电感、磁珠在EMC设计电路中是常见的身影,也是消灭电磁干扰的三大利器。
    发表于 08-24 17:26 264次阅读

    基于Java接口快速开发框架——magic-api

    magic-api 是一个基于Java接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Da
    发表于 07-19 11:42 432次阅读
    基于<b class='flag-5'>Java</b>的<b class='flag-5'>接口</b>快速开发框架——magic-api

    S-function详解与模型参考自适应仿真案例

    S-Function是system-function系统函数的缩写,是指采用非图形化的方式描述的一个功能块。S-Function提供给用户自己编写程序来满足自己要求模型的接口
    的头像 发表于 06-30 17:03 974次阅读
    S-<b class='flag-5'>function</b>详解与模型参考自适应仿真案例

    代码如何优化掉多余的if/else?

    的if/else? 1. 提前 return 这是判断条件取反的做法,代码在逻辑表达上会更清晰,看下面代码: if (condition) { // do something} else { return xxx
    的头像 发表于 06-22 10:01 462次阅读
    代码如何优化掉多余的if/<b class='flag-5'>else</b>?

    function与invoke的区别

    std::function和std::invoke是两个不同的东西,功能也不同。std::function 是一个函数对象的封装器,可以用来封装任意类型的可调用对象,比如函数指针、lambda表达式等
    的头像 发表于 04-27 15:13 461次阅读

    在Python中的if...else条件语句介绍

    在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。
    的头像 发表于 04-19 15:43 768次阅读

    详解Python条件语句

    在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。
    的头像 发表于 04-19 15:39 569次阅读