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

news2024/10/2 22:30:39

文章目录

  • 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的表现形式为不接受参数、只返回数据

在这里插入图片描述

Consumer消费型函数

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

在这里插入图片描述

Runnable无参无返回型函数

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

在这里插入图片描述

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

在这里插入图片描述

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://github.com/YunaiV/ruoyi-vue-pro
视频教程:https://doc.iocoder.cn/video/

使用小技巧

处理抛出异常的if

1、定义函数

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

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

    /**
     * 抛出异常信息
     *
     * @param message 异常信息
     * @return void
     **/
    void throwMessage(String message);
}

2、编写判断方法

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

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

    return (errorMessage) -> {
        if (b){
            throw new RuntimeException(errorMessage);
        }
    };
}

3、使用方式

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

在这里插入图片描述

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

在这里插入图片描述

处理if分支操作

1、定义函数式接口

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

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

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

}

2、编写判断方法

创建一个名为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();
        }
    };
}

3、使用方式

参数为true时,执行trueHandle

在这里插入图片描述

参数为false时,执行falseHandle

在这里插入图片描述

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

1、定义函数

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

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

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

2、编写判断方法

创建一个名为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);
        }
    };
}

3、使用方式

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

参数不为空时,打印参数

在这里插入图片描述

参数不为空时

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目流程管理工具 OmniPlan Pro 4 mac中文版软件介绍

OmniPlan Pro mac是 The Omni Group 为 macOS 和 iOS 操作系统开发的项目管理软件。它允许用户创建和管理复杂的项目、定义任务、分配资源、跟踪进度和生成报告。 OmniPlan Pro mac包括甘特图、网络图、关键路径分析、资源均衡和成本跟踪等功能。 借助 OmniPlan Pro&#xff0…

G3ESa HENF318736R1 E3EB HENF315129R1

G3ESa HENF318736R1 E3EB HENF315129R1 该ARC研究探索了当前和历史市场表现以及相关技术和业务趋势&#xff0c;确定了领先的技术供应商&#xff0c;并为中央电站发电应用中的分布式控制系统的全球市场提供了五年全球预测。这项新研究基于ARC行业领先的市场研究数据库、广泛的…

《安富莱嵌入式周报》第326期:航空航天级CANopen协议栈,开源USB PD电源和功耗分析,开源EtherCAT伺服驱动板,时序绘制软件,现代机器人设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; BSP视频教程第28期&#xff1a;CANopen协议栈专题&#xff0c;CANopen主从机组网实战&a…

分享34个发布商会PPT,总有一款适合您

分享34个发布商会PPT&#xff0c;总有一款适合您 链接&#xff1a;https://pan.baidu.com/s/1jP9toqTZONWeDIcxvw1wxg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付费甚…

重装系统后,anaconda如何恢复

电脑中给予anaconda创建了100个虚拟环境&#xff08;夸张了&#xff09; 因为硬盘的问题&#xff0c;需要重装系统&#xff0c;于是搜了一下如何恢复anaconda&#xff0c;如下&#xff1a; 1. cd 到anaconda的安装路径&#xff1b; 2. 运行下面命令&#xff1a; python .\L…

建设项目管理中的 5 大预算挑战

为建设项目管理制定可靠、准确的预算是一项艰巨的任务&#xff0c;对于中小型建筑企业来说尤其如此。预算必须精确&#xff0c;同时还要考虑到每项工作的独特性和复杂性。 一项建筑行业相关调查统计了参与施工预算流程的人员所面临的最大挑战&#xff0c;分别是时间、预算、不…

V90伺服EPOS模式点动控制(详细介绍+完整SCL代码)

V90伺服驱动器采用西门子标准报文111加FB284(SINA_POS)详细的报文组态和功能块请参考下面文章链接: 博途1200/1500PLC V90 PN通信控制 (FB284功能块)_fb284功能块文档说明_RXXW_Dor的博客-CSDN博客文章浏览阅读5.3k次。先简单说下如何获取FB284,一般有2种方法,Startdrive软…

java项目之摄影器材租赁系统(ssm框架)

项目简介 摄影器材租赁系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、用户管理、商家管理、器材信息管理、器材租赁管理、聊天信息管理、聊天回复管理、归还提醒管理、租赁反馈管理、论坛管理、系统管理、我的收藏管理 押金缴纳管理、扣除押金管理等等。用户&…

二百零一、Flink——Flink配置状态后端运行后报错:Can not create a Path from an empty string

一、目的 在尚硅谷学习用Flink配置状态后端的项目中&#xff0c;运行报错Exception in thread "main" java.lang.IllegalArgumentException: Can not create a Path from an empty string 二、Flink的状态后端(state backend)类型 &#xff08;一&#xff09;Memo…

Linux系统安装宝塔面板

系统安装要求 宝塔Linux面板操作系统支持&#xff1a;Centos、Ubuntu、Deepin、Alibaba Cloud Linux、Debian和Fedora&#xff0c;建议使用购买ECS后全新未操作的系统或执行初始化后的系统。 不支持32位系统。 请确认在安装宝塔面板前&#xff0c;未通过任何方式或程序安装Ap…

1.1 微信支付接入指引与支付安全

微信支付接入指引与支付安全 文章目录 微信支付接入指引与支付安全一、微信产品介绍1.1 付款码支付1.2 JSAPI支付1.3 小程序支付1.4 Native支付1.5 APP支付1.6 刷脸支付 二、接入指引2.1 获取商户号2.2 获取AppID2.3 绑定商户号与AppId2.4 获取秘钥和证书2.4.1 申请API秘钥2.4.…

Java进阶篇--Executors类创建常见线程池

目录 线程池架构 newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool Executors和ThreaPoolExecutor创建线程池的区别 两种提交任务的方法 线程池架构 线程池是一种线程管理的机制&#xff0c;用于维护和复用线程&#xff0c;以…

手术训练系统项目

★ 手术训练系统项目 项目描述&#xff1a;手术训练系统&#xff0c;它提供了多项功能&#xff0c;包括账户登录与创建、数据库与账户管理、课程管理、小组管理、成绩统计、证书发布、训练和系统设置。 职责描述: 1、训练功能开发&#xff08;任务概述、任务指导、评分规则、评…

惊艳!拓世法宝AI智能数字人一体机解锁数字文博的全民体验

在数字化的潮流中&#xff0c;我们见证了历史与现代技术的完美融合。在今年的“国际古迹遗址日”&#xff0c;世界首个超时空参与式博物馆“数字藏经洞”正式与公众见面&#xff0c;在这里开启了一场前所未有的文化探索之旅。 时间和空间被艺术化的数字技术巧妙地折叠&#xf…

建链时,please install openssl! use “openssl version“ command to check.

please install openssl! use “openssl version” command to check. 但是我已经安装了 编辑build_chain.sh文件 也可以用vi或者gedit命令 将 [ ! -z “ ( o p e n s s l v e r s i o n ∣ g r e p 1.0.2 ) " ] ∣ ∣ [ ! − z " (openssl version | grep 1.0.2)…

YOLO目标检测——红绿灯检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红绿灯检测数据集在自动驾驶、交通安全监控、智能交通系统、交通流量监测和驾驶员辅助系统等领域都有广泛应用的潜力数据集说明&#xff1a;红绿灯检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有国内红绿灯…

ARM64 linux并发与同步之原子操作

卷2&#xff1a;调试与案例分析 第一章 并发与同步 画了两张简图&#xff0c;方便理解&#xff0c;如下&#xff1a; 针对并发源的问题&#xff0c;我接触的项目中都是SMP系统&#xff0c;目前大部分也都是SMP系统&#xff1b; 对于SMP系统&#xff0c;情况会更复杂。 □ 同…

第二证券:特斯拉将推出低价电动汽车?最新消息

当地时间周一&#xff0c;投资者接连上星期五的达观心境&#xff0c;美国三大股指高开高走。美联储主席鲍威尔本周到会活动时将有两次揭穿说话&#xff0c;投资者期望从中得到更多关于本轮加息周期完毕的信号&#xff0c;但也对联邦基金利率可能在更长时期内维持在高水平保持警…

我的创作纪念日——2048天

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Java并发工具-1-原子操作(Atomic)

一 原子操作之 AtomicInteger 1 概念解释 什么是原子操作呢&#xff1f;所谓原子操作&#xff0c;就是一个独立且不可分割的操作。 AtomicInteger 工具类提供了对整数操作的原子封装。为什么要对整数操作进行原子封装呢&#xff1f; 在 java 中&#xff0c;当我们在多线程情…