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

 

往期热门文章:

1、Controller中的请求方法,private和public有什么区别?
2、再见Jenkins!一款更适合国人的自动化部署工具,贼带劲!!
3、MySQL中这14个小玩意,让人眼前一亮!!!
4、Spring 官方证实!大漏洞,JDK 9 及以上均受影响
5、阿里家属快当不下去了

在开发过程中经常会使用 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的表现形式为不接受参数、只返回数据。

58003215181f7808da1ee4fd46917cce.png

Consumer消费型函数

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

bfa7be1eac1d0b3cdbddec900e840b15.png

Runnable无参无返回型函数

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

3f2d7ef452566b8374c7086679d3ae9c.png

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

580642c2f22123f174cb14837eeeb6d7.png

使用小技巧

处理抛出异常的if

1.定义函数

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

/*** 抛异常接口**/
@FunctionalInterface
public interface ThrowExceptionFunction {/*** 抛出异常信息** @param message 异常信息* @return void**/void throwMessage(String message);
}

2.编写判断方法

创建工具类VUtils并创建一个isTure方法,方法的返回值为刚才定义的函数式接口-ThrowExceptionFunctionThrowExceptionFunction的接口实现逻辑为当参数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);}};
}

3.使用方式

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

f17d582a1d02bdc87c2c94846fb8eaf5.png

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

895e256093900069d76b543e7b48bb93.png

处理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);}

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

0e5e54fe02483aed4392359a323b8fcb.png

参数为false时,执行falseHandle

58448d5cbfbdd2a6a9b0c97004757422.png

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

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

参数不为空时,打印参数

b25f76b1a322c8140be805f960a0ed89.png

参数不为空时

42ebf67b19db84f900bbdf38732995c5.png

结尾

Function函数式接口是java 8非常重要的特性,利用好Function函数可以极大的简化代码。

原文:juejin.cn/post/7011435192803917831

往期热门文章:
1、IntelliJ IDEA终于支持对Redis 的可视化窗口操作了,真香!
2、ChatGPT能接入微信了!
3、Java 反射慢?它到底慢在哪?
4、当我去了不到 20 人的 IT 公司后。。。
5、GitHub 被超火的 ChatGPT 霸榜!
6、Java使用 try catch会影响性能?
7、Java使用 try catch会影响性能?
8、原来count(*)是接口性能差的真凶!
9、大公司病了,这也太形象了吧!!!
10、全球最大资源站创始人被抓,但网站还会继续活下去

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot + MDC 实现全链路调用日志跟踪

往期热门文章&#xff1a; 1、去TM的领导&#xff1a;发烧请病假&#xff0c;不意味着在家睡大觉 2、5年半老程序员被System.out.println() 考懵逼了... 3、妙用Java 8中的 Function接口&#xff0c;消灭if...else&#xff08;非常新颖的写法&#xff09; 4、Controller中的请求…

chatgpt赋能python:Python安装Kivy:强大的跨平台应用程序框架

Python安装Kivy: 强大的跨平台应用程序框架 Kivy是一个基于Python的跨平台开源应用程序框架&#xff0c;它可以用于开发多点触摸应用程序&#xff0c;使开发者能够轻松地创建适用于Windows&#xff0c;Mac&#xff0c;Linux&#xff0c;Android和iOS等平台的应用程序。Python作…

chatgpt赋能python:Python与界面绘制

Python与界面绘制 在现代计算机应用程序中&#xff0c;良好的用户界面设计和交互是至关重要的。它可以建立用户对应用程序的信任和舒适感&#xff0c;从而使应用程序更加实用和易于使用。而Python作为一种非常流行的编程语言&#xff0c;也提供了一些强大的工具和库&#xff0…

chatgpt赋能python:Python手机运行:轻巧便捷的编程语言

Python 手机运行&#xff1a;轻巧便捷的编程语言 Python作为一门高效&#xff0c;简单&#xff0c;易学的编程语言&#xff0c;逐渐成为程序员和数据科学家们的首选语言。无论是数据处理&#xff0c;机器学习还是人工智能&#xff0c;Python都具有出色的表现。不仅如此&#x…

chatgpt赋能python:Python调用ADBShell命令:使你的Android开发更高效

Python调用ADB Shell命令&#xff1a;使你的Android开发更高效 如果你是一名Android开发者&#xff0c;你一定会知道ADB&#xff08;Android Debug Bridge&#xff09;&#xff0c;它是一个可调试Android设备的多用途命令行工具。在许多情况下&#xff0c;ADB是许多Android开发…

Android 百度图像识别(详细步骤+源码)

百度图像识别 运行效果图一、创建平台应用二、创建Android项目三、网络访问框架四、添加请求API接口五、获取鉴权认证Token六、网络图片Url识别七、相册图片识别八、拍照图片识别九、源码 运行效果图 如果你对这个效果图不满意就不用往下看了&#xff0c;那样只会浪费你的时间。…

微信小程序,图像识别源码

目录 前言百度端配置信息小程序中代码&#xff1a;结语智能识图小程序源码下载路径&#xff1a;https://pan.baidu.com/s/1OGE7vhogS7L7nn0JIFPVWw 提取码&#xff1a;8ze9 前言 基于近期的工作内容关系&#xff0c;在查询一些资料的同时&#xff0c;在微信小程序端集成了图像…

图像识别小程序(含源码)【推荐】

目录 前言百度端配置信息小程序中代码&#xff1a;结语智能识图小程序源码下载路径&#xff1a;https://pan.baidu.com/s/1OGE7vhogS7L7nn0JIFPVWw 提取码&#xff1a;8ze9 前言 基于近期的工作内容关系&#xff0c;在查询一些资料的同时&#xff0c;在微信小程序端集成了图像…

(数学实验)Matlab实现猜数小游戏(增加了错误输入的判断)

刚开始做的时候不知道matlab没有自减运算&#xff0c;在网上查了很久资料&#xff0c;都没发现有对猜数游戏加错误输入判断的&#xff0c;经过多次试错&#xff0c;我弄出来了有判断的程序&#xff0c;在这里分享一下。 文章目录 前言一、问题描述二、解题思路 1.for循环2.whil…

使用Python为二年级的学生批量生成数学题

文章目录 一.使用Python为二年级的学生批量生成数学题1.1 背景 二.解决思路及其代码三.排版及其打印四.本文源码 一.使用Python为二年级的学生批量生成数学题 1.1 背景 我妹妹今年上二年级&#xff0c;她的老师今天给他们布置了一项作业&#xff1a; 从今天起到开学&#xff…

Fdog系列(一):思来想去,不如写一个聊天软件,那就从仿QQ注册页面开始吧。

文章目录 一.前言1. 基础布局2. 自动切换图片3. 添加内容4. 自动缩放&#xff0c;控件的显示和隐藏5.响应用户输入操作 所有文章源码已整体打包上传至github&#xff0c;求星星&#xff01; 一.前言 两年的大学生活马上就要结束了&#xff0c;马上面临实习&#xff0c;突然心…

基于Python的网络拓扑图绘制

最近写论文画了许多图&#xff0c;在这里记录一些。当然&#xff0c;如果仅仅是展示性图片的话也可以使用visio&#xff0c;但是这里我仍然想探究一下如何使用pyhon画出美观的网络拓扑图。 一、画出网络拓扑图 给出邻接矩阵&#xff0c;画出网络的拓扑图&#xff1a; import…

认识网络、几种常用的网络拓扑图

交换协议&#xff1a; VLAN技术&#xff1a;虚拟局域网 STP技术&#xff1a;生成树协议 VRRP技术&#xff1a;虚拟路由冗余协议 VPN&#xff1a;虚拟专用网络 名词解释 路由协议&#xff1a;http、HTTPS、tcp、ip 静态路由配置 OSPF协议 RIP协议 ACL访问控制 什么是网络&…

快速读懂网络拓扑图

快速读懂网络拓扑图 几重常见的网络拓扑总线型拓扑简介优点缺点 环型拓扑简介优点缺点 星型拓扑简介优点缺点 网络层级机构节点结点链路通路 不同的连接线代表什么意思&#xff1f;不同颜色、粗细的直线代表什么意思&#xff1f;闪电线-串行链路 几重常见的网络拓扑 总线型拓扑…

盘点5款常用的网络拓扑图制作工具

网络拓扑能直观明了的展示网络中各网元之间的关系&#xff0c;极大方便运维人员对网络进行优化配置、故障排查等操作。那么这个专业性比较强的拓扑图&#xff0c;要用什么工具把它轻松&#xff0c;简便的画出来呢&#xff1f;现对市场5款主流的拓扑制作软件进行介绍&#xff1a…

网络拓扑图怎么画 详细教程

大数据时代&#xff0c;如何更好地去运营、呈现数据&#xff0c;并从其中发掘出更多信息成为了人们探索的方向。网络拓扑图就是一种非常有用的信息化图表&#xff0c;这种网状关系呈现出来的利器可以使我们把想要传递的信息更加清晰、有逻辑的呈现在别人的眼前。 1. 什么是网络…

网络拓扑图

转载自&#xff1a;https://blog.csdn.net/weixin_40792878/article/details/82555594 什么是拓扑结构?   首先我们来解释一下拓扑的含义&#xff0c;所谓“拓扑”就是把实体抽象成与其大小、形状无关的“点”&#xff0c;而把连接实体的线路抽象成“线”&#xff0c;进而…

【新手】网络拓扑图要这样画

网络拓扑设计分为单核心和双核心两种 1. 单核心网络拓扑设计&#xff08;如图&#xff09; &#xff08;上图写的是路由器连接外网&#xff0c;也可以连接公司别的分支机构&#xff0c;比如现在是上海分公司&#xff0c;也可以用路由器和北京分公司相连&#xff0c;当然要借助…

关于网络拓扑图,你想知道的都在这

这篇文章&#xff0c;我将集中回答以下这四个问题&#xff1a; 网络拓扑图的定义网络拓扑图的分类网络拓扑图的设计规范网络拓扑图的绘制步骤 一、网络拓扑图的定义 在认识网络拓扑图前&#xff0c;我们先来了解下网络拓扑结构。 所谓网络拓扑结构&#xff0c;是指用传输媒…

作为程序员, 我如何使用ChatGPT来帮我写代码

从快速学习到调试程序&#xff0c; 甚至将繁琐的工作自动化。 我们每个人都渴望成功&#xff0c; 而获得成功的最有效的方式之一就是&#xff0c; 在尽可能短的时间内&#xff0c; 解决尽可能多的人的问题&#xff0c; 特别是大家都有的问题。 我们可以观察身边优秀的产品&…