Java 8 中的这个接口真好用!

news/2024/7/5 4:24:22

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

45c239cb2c5f33eac84a999fe96d09a5.png

Consumer消费型函数

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

59d2ab370575979b38a632ff9c098c0c.png

Runnable无参无返回型函数

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

a0f84072612de2715e2c00a64100bc95.png

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

ae506d5f68000d481d76cdaae98134cc.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时正常执行

7f944e0f6b66051da02075180fd528a5.png

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

0f3c144180ed3c01853879c6cf5e8d8f.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

800b0330d2ae045966084861d90adbbd.png

参数为false时,执行falseHandle

19a8c88949e7f4145986ccfa3e0c7f2e.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

参数不为空时,打印参数

e19deb3e47ca1887f76b7f7d4b2d4fb4.png

参数不为空时

1e01f2aec806a76e00cd6af16fbc7747.png

结尾

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

你会在代码中试试这种方法吗?欢迎留言说出你的看法!

来源:juejin.cn/post/7011435192803917831

热门内容:
  • 突发!Log4j 爆“核弹级”漏洞,Flink、Kafka等至少十多个项目受影响

  • 国内最牛逼的笔记,不接受反驳!!

  • 顶配版阿里大佬面试笔记+300道硬核面试题,跪着啃完了。。。。

  • 阿里二面:GET 请求能传图片吗?

31de0e362500ccf439eb525a01fc0b61.png

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡


http://lihuaxi.xjx100.cn/news/258071.html

相关文章

博士生制毒被抓,只因得不到家人认可,想快速致富...

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文来源&#xff1a;环球时报、天台县公安局等近期&#xff0c;内蒙古通辽市警方成功侦破一起公安部毒品目标案件&#xff0c;捣毁制毒窝点2处&#xff0c;缴获冰毒 407 克…

windows远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可

远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可。 &#xff08;也可以用 mstsc /admin&#xff09; 可以在运行里使用mstsc /console /v:IP:远程端口即可强制登录; 如果直接在远程桌面连接端使用就直接输入/console /v:IP:远程端口. 如&#xff1a;mstsc /cons…

lemon的简单使用

lemon概述 lemon是LALR(1)的用于c或c的解析器与生成器&#xff0c;与大名鼎鼎的bison与yacc做类似的工作&#xff0c;但又不是简单复制它们的功能&#xff0c;lemon使用了设计了不同的语法格式来减少编码的错误&#xff0c;lemon还使用了比yacc和bison更快的更复杂的解析引擎&…

为何我的BLOG不能DIY?

今天想把MODULE调整一下&#xff0c;居然搞不定。估计是服务器又出问题了........不知道51CTO有没有备份我们的博克呀&#xff1f;

如何利用神经网络结合遗传算法进行非线性函数极值寻优(2)

如何利用神经网络结合遗传算法进行非线性函数极值寻优

阿里云发布第四代神龙架构云计算首次进入5微秒时延时代

10月20日&#xff0c;2021云栖大会上&#xff0c;阿里云宣布推出第四代神龙架构&#xff0c;这是飞天云操作系统新一代虚拟化技术&#xff0c;首次搭载全球唯一的大规模弹性RDMA加速网络&#xff0c;网络延迟整体降低80%以上。神龙4.0带来的计算架构革新&#xff0c;将云计算首…

王茂霖:特征工程方法总结!

↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习&#xff0c;不错过Datawhale干货 作者&#xff1a;王茂霖&#xff0c;华中科技大学&#xff0c;Datawhale成员内容概括1.经典特征工程构造2.特征工程案例实践PPT完整下载&#xff1a;后台回复“210501”可获…

首次在智能手机上训练BERT和ResNet,能耗降35%

视学算法报道机器之心编辑部研究者表示&#xff0c;他们将边缘训练看作一个优化问题&#xff0c;从而发现了在给定内存预算下实现最小能耗的最优调度。目前&#xff0c;智能手机和嵌入式平台等边缘设备上已经广泛部署深度学习模型来进行推理。其中&#xff0c;训练仍然主要是在…