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
    +关注

    关注

    20

    文章

    2990

    浏览量

    111817
  • 函数
    +关注

    关注

    3

    文章

    4388

    浏览量

    65391

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    全新ES8预售发布

    2025年8月21日,全场景科技旗舰SUV——蔚全新ES8预售发布。
    的头像 发表于 08-22 16:49 ?312次阅读

    全新蔚ES8屏幕配置解析

    8月21日,第三代全新蔚ES8闪亮登场,历经7年积累进化,以“王者归来”之势,引领豪华大三排SUV进入纯电时代。
    的头像 发表于 08-22 16:45 ?185次阅读

    利用Arm i8mm指令优化llama.cpp

    本文将为你介绍如何利用 Arm i8mm 指令,具体来说,是通过带符号 8 位整数矩阵乘加指令 smmla,优化 llama.cpp 中 Q6_K 和 Q4_K 量化模型推理。
    的头像 发表于 07-24 09:51 ?1041次阅读
    <b class='flag-5'>利用</b>Arm i<b class='flag-5'>8</b>mm指令优化llama.cpp

    如何调用C的接口封装micropyton接口?

    microPython的库比较少,无法满足需求,请问调用C的接口封装micropyton接口如何操作?能否提供详细步骤? 你好,可以参考micropython官方的教程添加自定义的
    发表于 06-23 07:17

    Java的SPI机制详解

    作者:京东物流 杨苇苇 1.SPI简介 SPI(Service Provicer Interface)是Java语言提供的一种接口发现机制,用来实现接口接口实现的解耦。简单来说,就是
    的头像 发表于 03-05 11:35 ?882次阅读
    <b class='flag-5'>Java</b>的SPI机制详解

    华为云 Flexus X 实例下的场景体验——小企业必备——JAVA 环境搭建——保姆级教学

    前言 上次我们使用的是 Ubuntu 操作的,这里跑的服务器多的还是 Huawei Cloud EulerOS,所以我们还原到基础镜像上做环境架设,此次我们架设 java 的基础运行环境,是能
    的头像 发表于 01-07 17:05 ?560次阅读
    华为云 Flexus X 实例下的场景体验——小企业必备——<b class='flag-5'>JAVA</b> 环境搭建——保姆级教学

    利用FPGA实现USB 2.0通信接口

    USB?2.0接口的实现方式 利用FPGA实现USB 2.0接口的方式一般有两种,一是借助外围的USB接口芯片,二是FPGA内部实现USB
    的头像 发表于 12-30 13:59 ?3114次阅读
    <b class='flag-5'>利用</b>FPGA实现USB 2.0通信<b class='flag-5'>接口</b>

    verilog计数器代码为什么要使用这句话if (count===8\'bxxxxxxxx)count=8\'b0000_0000;

    ; else if(count==8\'b1111_1111) count<=8\'b0000_0000; else count<=count+1; end endmodu
    发表于 12-21 14:49

    Java 23功能介绍

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

    Java集合API的改进介绍

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

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

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

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

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

    基于Java的工具Power Stage Designer

    电子发烧友网站提供《基于Java的工具Power Stage Designer.pdf》资料免费下载
    发表于 11-14 16:01 ?12次下载
    基于<b class='flag-5'>Java</b>的工具Power Stage Designer

    Java中时间戳的使用

    Java中时间戳的使用
    的头像 发表于 11-06 16:04 ?581次阅读
    <b class='flag-5'>Java</b>中时间戳的使用

    java反编译能拿到源码吗

    Java反编译是一种将编译后的Java字节码(.class文件)转换回Java源代码的过程。虽然反编译可以帮助理解代码的逻辑和结构,但它并不总是能完美地还原原始源代码。反编译工具通常会产生与原始代码
    的头像 发表于 09-02 11:03 ?1930次阅读