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

    文章

    2952

    浏览量

    104454
  • 函数
    +关注

    关注

    3

    文章

    4276

    浏览量

    62303

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

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

收藏 人收藏

    评论

    相关推荐

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

    的平台,Java可以用于开发桌面应用程序、移动应用程序、企业级应用程序等。 – Java Web是Java语言在Web开发领域的应用,它使用Java技术
    的头像 发表于 07-16 13:35 601次阅读
    华纳云:<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>有什么区别

    java实现多线程的几种方式

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

    verilog task和function区别

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

    verilog中function和task的区别

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

    java环境配置成功后怎么运行

    Java环境配置成功后,我们可以使用几种方式运行Java程序。下面将详细介绍这几种方式以及其使用方法。 命令行运行方式 在成功配置Java环境后,我们可以通过命令行
    的头像 发表于 12-06 15:57 1881次阅读

    java环境下如何使用hash函数

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

    Java各种类的区别

    Java中的类可以分为以下几种类型:基本类、包装类、自定义类、抽象类、接口类和内部类。 基本类: 基本类是Java语言中最基本的类,主要用于描述基本数据类型(如整型、浮点型、字符型等)。Jav
    的头像 发表于 12-03 11:08 7587次阅读

    Verilog代码:if-else和case的电路结构和区别

    导致设计的更大延时,为了避免较大的路径延迟,最好不要使用特别长的嵌套if结构。如想利用if语句实现那些对延时要求苛刻的路径时,应将最高优先级给最迟到达的关键信号。
    的头像 发表于 11-29 15:10 2627次阅读

    简单了解Java的新特性

    Java 8Java 20,Java 已经走过了漫长的道路,自 Java 8 以来,
    的头像 发表于 11-23 16:38 1037次阅读
    简单了解<b class='flag-5'>Java</b>的新特性

    java内存溢出排查方法

    模型。Java内存模型分为线程栈、堆、方法区(Java 8之前称为永久代,Java 8后称为元空间)和本地方法栈
    的头像 发表于 11-23 14:46 3003次阅读

    java接口是特殊的抽象类吗

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

    Java中抽象类和接口的介绍

    Java是一种面向对象的编程语言,提供了抽象类和接口两种机制帮助开发人员组织和管理代码。本文将详细介绍Java语言中抽象类和接口的概念、特
    的头像 发表于 11-21 09:47 426次阅读

    java接口和抽象类的区别

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

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

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

    shell并行执行java脚本

    供一些代码示例。 准备工作 在执行Java程序之前,我们需要确保系统已经安装了Java开发环境(JDK)。你可以在终端中输入以下命令检查是否已安装Java: 你可以使用GNU par
    的头像 发表于 11-08 10:29 637次阅读