妙用Java 8中的 Function接口 消灭if...else(非常新颖的写法)
码农突围
共 2639字,需浏览 6分钟
·
2021-12-01 00:30
点击上方“码农突围”,马上关注
这里是码农充电第一站,回复“666”,获取一份专属大礼包 真爱,请设置“星标”或点个“在看
来源:juejin.cn/post/7011435192803917831
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供给型函数
![](https://filescdn.proginn.com/ba0ae10499f8d437cf28461ec2e146a2/23cebbe4bbdb457070a8a0ca77106a53.webp)
Consumer消费型函数
![](https://filescdn.proginn.com/6144f25ef6a81249f516f14bbdcaa878/46d58a48e7806d0e366cd9f1e74af718.webp)
Runnable无参无返回型函数
![](https://filescdn.proginn.com/43c323795c9d21ca150d31fecb30dd23/fec9e60f9ce43527c13ed0fad7f2bcae.webp)
Supplier
、Consumer
和Runnable
可以看作Function的一种特殊表现形式![](https://filescdn.proginn.com/aabffa790591192d6caa26766a37fa2c/24cb4551564a3af94e92be14dcded8ba.webp)
使用小技巧
处理抛出异常的if
/**
* 抛异常接口
**/
@FunctionalInterface
public interface ThrowExceptionFunction {
/**
* 抛出异常信息
*
* @param message 异常信息
* @return void
**/
void throwMessage(String message);
}
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);
}
};
}
throwMessage
方法传入异常信息。当出入的参数为false时正常执行![](https://filescdn.proginn.com/5af37a330af9f9dae7f1a2005d7b3d12/808ec3de803dacdb492ae2232f08b6e0.webp)
![](https://filescdn.proginn.com/d5bde799a0a04e4ff8552e90d83f6583/a9628011cf84d2e912637f84bb0ea3c9.webp)
处理if分支操作
BranchHandle
的函数式接口,接口的参数为两个Runnable接口。这两个两个Runnable接口分别代表了为true或false时要进行的操作/**
* 分支处理接口
**/
@FunctionalInterface
public interface BranchHandle {
/**
* 分支操作
*
* @param trueHandle 为true时要进行的操作
* @param falseHandle 为false时要进行的操作
* @return void
**/
void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);
}
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();
}
};
}
![](https://filescdn.proginn.com/977d4fff2d23d62b75eb83ba56ee4175/c53b636091260b9b6df23023f0cf5a19.webp)
![](https://filescdn.proginn.com/01c87cd3ea92ebebfe190e055acebd51/420646f0b51c692edc0b387145f4a5b4.webp)
如果存在值执行消费操作,否则执行基于空的操作
PresentOrElseHandler
的函数式接口,接口的参数一个为Consumer接口。一个为Runnable,分别代表值不为空时执行消费操作和值为空时执行的其他操作/**
* 空值与非空值分支处理
*/
public interface PresentOrElseHandler<T extends Object> {
/**
* 值不为空时执行消费操作
* 值为空时执行其他的操作
*
* @param action 值不为空时,执行的消费操作
* @param emptyAction 值为空时,执行的操作
* @return void
**/
void presentOrElseHandle(Consumer super T> action, Runnable emptyAction);
}
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);
}
};
}
presentOrElseHandle
方法传入一个Consumer
和Runnable
![](https://filescdn.proginn.com/40e357ed6e8303a8abd3fcbc119bb831/935639a426bd186898e7fa38fe388873.webp)
![](https://filescdn.proginn.com/aa9d1039a4faf4bfb0f996c153312bd0/065d158825f8b7a3d1ec760428789176.webp)
结尾
-End-
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
面试题
】即可获取评论