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

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

3天内不再提示

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

jf_ro2CN3Fa 来源:芋道源码 2023-11-10 16:23 次阅读


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

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

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

Function 函数式接口

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

Function可以看作转换型函数

Supplier供给型函数

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

9b94ce8c-7f69-11ee-939d-92fbcf53809c.jpg

Consumer消费型函数

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

9ba12010-7f69-11ee-939d-92fbcf53809c.jpg

Runnable无参无返回型函数

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

9bc18c2e-7f69-11ee-939d-92fbcf53809c.jpg

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

9bcdee92-7f69-11ee-939d-92fbcf53809c.jpg

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

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

使用小技巧

处理抛出异常的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时正常执行

9bded234-7f69-11ee-939d-92fbcf53809c.jpg

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

9beeae8e-7f69-11ee-939d-92fbcf53809c.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

9bff7a70-7f69-11ee-939d-92fbcf53809c.jpg

参数为false时,执行falseHandle

9c0a3da2-7f69-11ee-939d-92fbcf53809c.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

参数不为空时,打印参数

9c1ba72c-7f69-11ee-939d-92fbcf53809c.jpg

参数不为空时

9c2cf022-7f69-11ee-939d-92fbcf53809c.jpg


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

    关注

    19

    文章

    2904

    浏览量

    103004
  • 参数
    +关注

    关注

    11

    文章

    1398

    浏览量

    31480
  • 函数
    +关注

    关注

    3

    文章

    3911

    浏览量

    61313

原文标题:妙用Java 8中的 Function接口,消灭if...else(非常新颖的写法)

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    phprename()函数的妙用

    phprename()函数的妙用 大家都知道,rename()函数可以对文件或目录进行重命名的操作。其实它还可以做很多事情。 熟悉unix的朋友应该知道shell命令mv,它相当
    发表于 01-11 09:33

    错误簇的妙用

    错误簇的妙用,可以拆分提示
    发表于 08-21 10:50

    psoc3上wavedac8的最大输出频率是多少?

    你好,这些论坛非常新颖。我正在对CY8CKIT-030平台上的PSoC3进行评估,我想知道我能从WaveDAC8获得什么最大的频率?我能做的最好的事情是2.5kHz,但我看到一个外部时钟。我还和其他
    发表于 09-09 13:11

    消灭 Java 代码的“坏味道”

    (list.get(list.size() - 1));} else { // 内部可能是链表实现,随机访问效率低}1.7.频繁调用 Collection.contains 方法请使用 Set在 java 集合
    发表于 09-16 15:03

    消灭EMC三大利器的原理

    来源:互联网滤波电容器、共模电感、磁珠在 EMC 设计电路是常见的身影,也是消灭电磁干扰的三大利器。文章从设计详细分析了消灭 EMC 三大利器的原理。
    发表于 10-22 08:55

    Java为什么要使用接口_java接口怎么使用

    Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
    的头像 发表于 03-26 17:44 1.8w次阅读

    一篇非常新的介绍PyTorch内部机制的文章

    译者序:这篇博文是一篇非常新的介绍PyTorch内部机制的文章,作者Edward Z Yang来自于Stanford大学,是PyTorch的核心开发者之一。文章中介绍了如何阅读PyTorch源码
    的头像 发表于 12-26 10:17 1870次阅读
    一篇<b class='flag-5'>非常新</b>的介绍PyTorch内部机制的文章

    非常新手之430单片机

    非常新手之430单片机(单片机课程设计电子密码锁)-文档为非常新手之430单片机讲解文档,是一份不错的参考资料,感兴趣的可以下载看看,,,,,,,,,,,,,,
    发表于 09-30 11:04 2次下载
    <b class='flag-5'>非常新</b>手之430单片机

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

    在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function
    的头像 发表于 04-21 10:23 2344次阅读

    JAVA8提供了Optional类来优化这种写法

    这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明
    的头像 发表于 04-24 15:18 853次阅读

    Java方法中调用Lua function

    Java先载入login.lua脚本并编译,然后再获取指定名称的函数,无参的直接使用call()方法调用,带参的需要通过invoke(LuaValue[])传入参数表。
    的头像 发表于 09-07 10:47 1053次阅读

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

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

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

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

    java接口是特殊的抽象类吗

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

    磁环在EMC中的妙用

    磁环在EMC中的妙用
    的头像 发表于 11-27 14:48 317次阅读
    磁环在EMC中的<b class='flag-5'>妙用</b>