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

    文章

    2967

    浏览量

    104761
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62627

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

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

收藏 人收藏

    评论

    相关推荐

    Java 23功能介绍

    Java 23 包含全新和更新的 Java 语言功能、核心 API 以及 JVM,同时适合新的 Java 开发者和高级开发者。从 IntelliJ IDEA 2024.2 开始已支持 Java
    的头像 发表于 12-04 10:02 209次阅读
    <b class='flag-5'>Java</b> 23功能介绍

    Java集合API的改进介绍

    简介 本文我们将探讨不同 jdk 版本中各类的起源,以及新引入的类和接口背后的目的。我们将分析之前版本存在的问题,以及为何需要引入新的类或接口。此外,我们还将介绍集合类和接口中的新特性。文章将逐一
    的头像 发表于 11-22 11:12 200次阅读
    <b class='flag-5'>Java</b>集合API的改进介绍

    Java 枚举与策略模式、函数式接口的结合:实现高内聚低耦合的设计

    中,通常会使用枚举定义业务上的一组常量,那除了简单地定义常量之外,我们如何利用枚举实现高内聚、低耦合的设计呢?下面介绍下枚举和策略模式、函数式接口的组合应用。 二、枚举+策略模式
    的头像 发表于 11-21 14:06 213次阅读

    能否利用TSW1400控制TX7316脉冲信号的发射,接收,波束形成?

    最近买了TX7316和TSW1400FPGA板,想请问一下,能否利用TSW1400控制TX7316脉冲信号的发射,接收,波束形成?如果可以的话,二者是利用什么接口连接的?是USB吗
    发表于 11-20 08:18

    华纳云:java web和java有什么区别java web和java有什么区别

    的平台,Java可以用于开发桌面应用程序、移动应用程序、企业级应用程序等。 – Java Web是Java语言在Web开发领域的应用,它使用Java技术
    的头像 发表于 07-16 13:35 811次阅读
    华纳云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么区别<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么区别

    接口测试的工具有哪些种类

    单元测试框架 单元测试框架主要用于测试单个模块或函数的功能。虽然它们主要用于开发阶段,但也可以用于接口测试。 1.1 JUnit (Java) JUnit 是 Java 语言的单元测试框架,支持自动化测试,可以测试
    的头像 发表于 05-30 15:07 718次阅读

    8芯M8接口需要经常检修吗

    德索工程师说道虽然8芯M8接口具有优异的性能和广泛的应用领域,但在实际使用过程中,仍需要经常进行检修。尽管8芯M8
    的头像 发表于 05-22 16:27 286次阅读
    <b class='flag-5'>8</b>芯M<b class='flag-5'>8</b><b class='flag-5'>接口</b>需要经常检修吗

    5芯M8接口的灵敏度怎么样

    德索工程师说道为了准确评估5芯M8接口的灵敏度,需要采用适当的测试方法。在静态条件下,向接口输入不同幅值的信号,观察接口的响应情况。通过测量接口
    的头像 发表于 05-22 16:04 268次阅读
    5芯M<b class='flag-5'>8</b><b class='flag-5'>接口</b>的灵敏度怎么样

    Oracle确认Java/JDK 11官方支持延长至2032年1月 

    此外,Solaris操作系统上的Java SE 8Java SE 11的官方支持也同步延期至2030年12月及2032年1月,进一步延长了该平台上的Java服务周期。
    的头像 发表于 05-16 15:57 1253次阅读

    深入理解Java 8内存管理机制及故障排查实战指南

    Java的自动内存管理机制是由 JVM 中的垃圾收集器实现的,垃圾收集器会定期扫描堆内存中的对象,检测并清除不再使用的对象,以释放内存资源。
    的头像 发表于 04-04 08:10 1005次阅读
    深入理解<b class='flag-5'>Java</b> <b class='flag-5'>8</b>内存管理机制及故障排查实战指南

    M12 8接口键控

    德索工程师说道在M12 8接口中,键控技术主要用于实现接口的锁定与解锁、配置选择以及设备识别等功能。通过键控技术,用户可以方便地对M12 8接口
    的头像 发表于 03-21 15:05 344次阅读
    M12 <b class='flag-5'>8</b>芯<b class='flag-5'>接口</b>键控

    java实现多线程的几种方式

    了多种实现多线程的方式,本文将详细介绍以下几种方式: 1.继承Thread类 2.实现Runnable接口 3.Callable和Future 4.线程池 5.Java 8
    的头像 发表于 03-14 16:55 709次阅读

    verilog task和function区别

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

    verilog function函数的用法

    Verilog 是一种硬件描述语言 (HDL),主要用于描述数字电子电路的行为和结构。在 Verilog 中,函数 (Function) 是一种用于执行特定任务并返回一个值的可重用代码块。函数在
    的头像 发表于 02-22 15:49 5712次阅读

    verilog中function和task的区别

    非常相似,但它们在功能和使用方式上有一些重要的区别。 定义和声明方式不同: Function:使用关键字"function"定义和声明。函数可以有一个或多个输入参数,可以有一个返回值。函数必须在声明之后直接定义,不能在其他函数
    的头像 发表于 02-22 15:40 1910次阅读