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

    文章

    2954

    浏览量

    104511
  • 参数
    +关注

    关注

    11

    文章

    1769

    浏览量

    32060
  • 函数
    +关注

    关注

    3

    文章

    4299

    浏览量

    62376

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

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

收藏 人收藏

    评论

    相关推荐

    消灭 Java 代码的“坏味道”

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

    消灭EMC三大利器的原理

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

    S参数在高频测量妙用

    S参数在高频测量妙用在个人计算机平台迈入 GHz阶段之后,从计算机的中央处理器、显示界面、存储器总线到I/O接口,全部走入高频传送的国度,于是高
    发表于 07-23 11:26 2301次阅读

    Java包、接口与异常处理(exception) 实验

    实验 4 包、接口与异常处理(exception) 一、实验目的     了解 Java 包(package)、接口(interface)和异常处理(e
    发表于 09-23 19:00 1182次阅读

    java8新特性

    java8接口声明添加非抽象方法的实现,也成为拓展方法。
    发表于 11-27 15:54 1731次阅读

    非常新手之430单片机

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

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

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

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

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

    Java方法调用Lua function

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

    关于Python的“for-else”功能

    无论使用哪种编程语言,我们都会编写“if-else”语句,但是“for-else”呢?
    发表于 09-26 14:44 540次阅读

    在Pythonif...else条件语句介绍

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

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

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

    磁环在EMC妙用

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

    电容在ESD测试整改妙用

    电容在ESD测试整改妙用
    的头像 发表于 12-07 09:44 610次阅读
    电容在ESD测试整改<b class='flag-5'>中</b>的<b class='flag-5'>妙用</b>

    verilogfunction和task的区别

    在VerilogFunction和Task是用于模块化设计和重用代码的两种重要元素。它们允许开发人员将复杂的操作分解为更小的功能单元,并在需要时调用它们。虽然Function和Task在某些方面
    的头像 发表于 02-22 15:40 1731次阅读