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

妙用Java 8中的 Function接口 消灭if...else(非常新颖的写法) 定义一个抛出异常的形式的函数式接口, 这个接口只有参数没有返回值是个消费型接口。 阅读详情

来源:juejin.cn/post/7011435192803917831

  • Function 函数式接口

    • Supplier供给型函数

    • Consumer消费型函数

    • Runnable无参无返回型函数

    • Function函数的表现形式为接收一个参数,并返回一个值。Supplier、Consumer和Runnable可以看作Function的一种特殊表现形式

  • 使用小技巧

    • 处理抛出异常的if

    • 处理if分支操作

    • 如果存在值执行消费操作,否则执行基于空的操作


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

if (...){
    throw new RuntimeException("出现异常了");
} 

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

Function 函数式接口

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

Function可以看作转换型函数

Supplier供给型函数

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

5c6c3d94a7281687e3752cc6a634e13c.jpeg

图片

Consumer消费型函数

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

8be1629e2634f918a88a37acc240d74a.jpeg

图片

Runnable无参无返回型函数

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

69cb08eb6398b0da10863773d8730375.jpeg

图片

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

3699667e9d95492fcdfe645c60d60fce.jpeg

图片

使用小技巧

处理抛出异常的if

  1. 定义函数

定义一个抛出异常的形式的函数式接口, 这个接口只有参数没有返回值是个消费型接口

/**
 * 抛异常接口
 **/
@FunctionalInterface
public interface ThrowExceptionFunction {

    /**
     * 抛出异常信息
     *
     * @param message 异常信息
     * @return void
     **/
    void throwMessage(String message);
}
  1. 编写判断方法

创建工具类VUtils并创建一个isTure方法,方法的返回值为刚才定义的函数式接口-ThrowExceptionFunction。ThrowExceptionFunction的接口实现逻辑为当参数b为true时抛出异常

/**
 *  如果参数为true抛出异常
 * 
 * @param b 
 * @return com.example.demo.func.ThrowExceptionFunction
 **/
public static ThrowExceptionFunction isTure(boolean b){

    return (errorMessage) -> {
        if (b){
            throw new RuntimeException(errorMessage);
        }
    };
}
  1. 使用方式

调用工具类参数参数后,调用函数式接口的throwMessage方法传入异常信息。当出入的参数为false时正常执行

636360c50ec970d54937cbfd5851d12b.jpeg

图片

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

9895b48622d984dc0c02320db3cf7838.jpeg

图片

处理if分支操作

  1. 定义函数式接口

创建一个名为BranchHandle的函数式接口,接口的参数为两个Runnable接口。这两个两个Runnable接口分别代表了为true或false时要进行的操作

/**
 * 分支处理接口
 **/
@FunctionalInterface
public interface BranchHandle {

    /**
     * 分支操作
     *
     * @param trueHandle 为true时要进行的操作
     * @param falseHandle 为false时要进行的操作
     * @return void
     **/
    void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);

}
  1. 编写判断方法

创建一个名为isTureOrFalse的方法,方法的返回值为刚才定义的函数式接口-BranchHandle。

/**
 * 参数为true或false时,分别进行不同的操作 
 * 
 * @param b 
 * @return com.example.demo.func.BranchHandle     
 **/
public static BranchHandle isTureOrFalse(boolean b){
    
    return (trueHandle, falseHandle) -> {
        if (b){
            trueHandle.run();
        } else {
            falseHandle.run();
        }
    };
}
  1. 使用方式

参数为true时,执行trueHandle

fee2046c896ee5a57ddc6a41143a85ef.jpeg

图片

参数为false时,执行falseHandle

d89c016c5957d1d6cf1eb47f4d74ad85.jpeg

图片

如果存在值执行消费操作,否则执行基于空的操作

  1. 定义函数

创建一个名为PresentOrElseHandler的函数式接口,接口的参数一个为Consumer接口。一个为Runnable,分别代表值不为空时执行消费操作和值为空时执行的其他操作

/**
 * 空值与非空值分支处理
 */
public interface PresentOrElseHandler<T extends Object> {

    /**
     * 值不为空时执行消费操作
     * 值为空时执行其他的操作
     * 
     * @param action 值不为空时,执行的消费操作
     * @param emptyAction 值为空时,执行的操作
     * @return void    
     **/
   void presentOrElseHandle(Consumer<? super T> action, Runnable emptyAction);
   
}
  1. 编写判断方法

创建一个名为isBlankOrNoBlank的方法,方法的返回值为刚才定义的函数式接口-PresentOrElseHandler。

/**
 * 参数为true或false时,分别进行不同的操作
 *
 * @param b
 * @return com.example.demo.func.BranchHandle
 **/
public static PresentOrElseHandler<?> isBlankOrNoBlank(String str){

    return (consumer, runnable) -> {
        if (str == null || str.length() == 0){
            runnable.run();
        } else {
            consumer.accept(str);
        }
    };
}
  1. 使用方式

调用工具类参数参数后,调用函数式接口的presentOrElseHandle方法传入一个Consumer和Runnable

参数不为空时,打印参数

779208d3cf760d382b5dcf9703589189.jpeg

图片

参数不为空时

7ae66af5e2a8bfa9b19a5966ab6dab0e.jpeg

利用Spm12进行fMRI数据分析:从预处理到结果解读的完整指南 本文提供了利用SPM12进行fMRI数据分析的完整流程指南,涵盖从数据预处理、统计建模到结果解读的全过程。详细介绍了在MATLAB环境下使用SPM12图形界面完成头动矫正、空间标准化等关键步骤的操作方法与避坑技巧,帮助神经科学研究者和心理学研究者高效处理功能磁共振成像数据并产出可靠结果。 阅读详情

相关推荐

博途AI助手演示,完成简单且重复的梯形图代码,并导入到博途

自写个博途AI助手,下面演示AI帮我生成完善多个模拟量输入转换的代码,

gsjkwg的博客 1529

java中接口的妙用(二)

java中接口的妙用(二): 1。写在前面:     本例子是另外一篇博文“java中接口的妙用(一)”的姊妹篇。在进行程序设计时,通常会进行模块划分,从顶层到底层;而且,尽可能使各个模块进行松耦合,这样,当修单个模块时,做到不影响其它模块。 下面这个例子,演示了如何进行分层设计,并且使用interface(接口)来进行数据的转移。 2. 例子业务说明:    本例子只是

记录和分享程序人生的点点滴滴 1601

告别城市峡谷定位漂移:手把手教你用PSINS仿真INS/NHC/ODO组合导航(附代码获取)

本文详细解析了INS/NHC/ODO组合导航系统在城市峡谷环境中的应用,通过PSINS平台实现精准定位。文章涵盖核心原理、环境搭建、算法实现及性能优化,帮助开发者解决GNSS信号中断时的定位漂移问题,提升自动驾驶系统在复杂环境中的可靠性。

weixin_30329623的博客 430

Java中减少代码if/else嵌套N种方法

记住,减少if/else嵌套并不总是目标。有时,简单的if/else结构可能是最清晰和最直接的表达方式。减少代码中的if/else嵌套是提高代码可读性和可维护性的重要手段。函数式编程提供了高阶函数、映射、过滤等概念,这些都可以帮助你更简洁地表达逻辑,减少if/else的使用。定期进行代码审查并与团队成员讨论如何改进代码结构,可以帮助你发现并减少不必要的if/else嵌套。如果条件是基于离散的值,你可以使用映射或查找表来避免if/else。对于简单的条件判断,可以使用三元运算符来替代简单的if/else。

java专栏 1128

FSL软件安装

FSL软件安装

huang_tianyuan的博客 2633

python爬虫自动下载网页链接

需求分析 今天遇到一个简单的需求,需要下载澳大利亚电力市场NEM日前市场的发电商报价数据(http://nemweb.com.au/Reports/Current/Next_Day_Offer_Energy/),页面观感是这样的: Ctrl + F 一下,看到一共有395个zip链接。于是就想着用python爬虫自动下载。这个网页很简单,没有验证码,甚至不需要登录,因此自动下载的pytho...

da_kao_la的博客 1万+

java8 新特性函数式编程lambda和stream详解

一、初识lambda表达式 lambda表达式是一个匿名函数,我们可以把lamdba表达式理解为是一段可以传递的代码。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,是java的语言表达能力得到了提升。 先不说语法,我们先来做一个需求: 获取当前公司中员工年龄大于35的员工信息 List<Person> emps = ...

q865165648的博客 403

手把手教你使用transciver-ip核的配置

手把手教你使用transciver-ip核的配置

u012938458的博客 5418

Java8新特性函数式编程

函数式编程-Lambda表达式、Stream流、Optional

一生烟雨的博客 428

23. STM32F103C8T6 ADC采集光敏电阻传感器模块光照强度实战

本文详细介绍了如何使用STM32F103C8T6的ADC模块采集光敏电阻传感器的光照强度。通过硬件接线、核心原理讲解、四步代码配置(GPIO、ADC模式、使能校准、数据滤波)以及串口验证,手把手指导完成从模拟信号到数字值的完整实战流程,并重点提示了ADC时钟分频等关键配置要点。

weixin_42300144的博客 223

告别‘Duang’的一声:手把手解决RK3588开发板PCIe初始化卡死问题(DTS修改实战)

本文详细介绍了解决RK3588开发板PCIe初始化卡死问题的完整过程,包括问题诊断、DTS文件修改及编译烧写步骤。通过禁用未使用的PCIe硬件资源,有效解决了启动卡死问题,为嵌入式开发者提供了实用的调试方法和经验总结。

weixin_30753873的博客 218

Java8 lambda表达式详解

Scala中函数是一等公民,有大量的函数式编程,而Java1.8的新特性也加入了函数式编程,转载如下。 关键词:函数式接口、lambda表达式 作用:函数式编程、替换匿名内部类(利用lambda实现函数式中的函数)。 基本语法:3 部分 1 左侧:一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数 2 中间:一个箭头符号:-> 3 右侧:方法体,可以是表达式和代码块...

统木木的博客 1万+

手把手教你学Simulink--基于新型通信技术集成的场景实例:无人机利用激光通信实现高速率数据传输

摘要: 本文基于Simulink搭建无人机激光通信仿真系统,解决传统射频通信带宽不足问题。系统通过五层架构(发射机、信道、PAT系统、接收机、性能分析)实现Gbps级高速传输,重点建模大气衰减(雾/雨)、光束发散、PAT精跟踪(Stateflow+PID控制)等核心模块。仿真结果显示:晴天链路可达2.5Gbps(BER 1e-8),浓雾下链路中断,验证了雾是主要性能限制因素。案例涵盖调制方式选择、动态环境仿真及3D可视化,为无人机高速数据传输提供可扩展的仿真框架,并指出混合FSO/RF、AI-PAT等优化方

MHD0815的博客 181

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

点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方有惊喜留言必回,有问必答!每天08:35更新文章,每天进步一点点...在开发过程中经常会使用if...el...

Java精选 505

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

点击下方“Java编程鸭”关注并标星更多精彩 第一时间直达在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if...else...。if(...){ thrownewRuntimeException("出现异常了"); } if...

民工哥的博客 219

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 收到 offer 了,月薪50k*18薪,爽!
下一篇: 手把手教学,从0开发前后端微商城项目,主流Java技术一网打尽!
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值