您现在的位置是:亿华云 > 系统运维
Map+函数式接口方法 优雅的解决 if-else
亿华云2025-10-05 04:21:37【系统运维】7人已围观
简介大家好,我是不才陈某~最近写了一个服务:根据优惠券的类型resourceType和编码resourceId来 查询 发放方式grantType和领取规则实现方式:根据优惠券类型resourceTy
大家好,数式我是接口决不才陈某~
最近写了一个服务:根据优惠券的类型resourceType和编码resourceId来 查询 发放方式grantType和领取规则
实现方式:
根据优惠券类型resourceType -> 确定查询哪个数据表根据编码resourceId -> 到对应的数据表里边查询优惠券的派发方式grantType和领取规则优惠券有多种类型,分别对应了不同的优雅数据库表:
红包 —— 红包发放规则表购物券 —— 购物券表QQ会员外卖会员实际的优惠券远不止这些,这个需求是数式要我们写一个业务分派的逻辑。
第一个能想到的接口决思路就是if-else或者switch case:
switch(resourceType){
case "红包":
查询红包的派发方式
break;
case "购物券":
查询购物券的派发方式
break;
case "QQ会员" :
break;
case "外卖会员" :
break;
......
default : logger.info("查找不到该优惠券类型resourceType以及对应的派发方式");
break;
}如果要这么写的话, 一个方法的优雅代码可就太长了,影响了可读性。数式(别看着上面case里面只有一句话,接口决但实际情况是优雅有很多行的)。
而且由于 整个 if-else的数式代码有很多行,也不方便修改,接口决可维护性低。优雅
策略模式策略模式是高防服务器数式把 if语句里面的逻辑抽出来写成一个类,如果要修改某个逻辑的接口决话,仅修改一个具体的优雅实现类的逻辑即可,可维护性会好不少。
策略模式
策略模式在业务逻辑分派的时候还是if-else ,只是说比第一种思路的if-else 更好维护一点。
switch(resourceType){
case "红包":
String grantType=new Context(new RedPaper()).ContextInterface();
break;
case "购物券":
String grantType=new Context(new Shopping()).ContextInterface();
break;
......
default : logger.info("查找不到该优惠券类型resourceType以及对应的派发方式");
break;但缺点也明显:
如果 if-else的判断情况很多,那么对应的具体策略实现类也会很多,上边的具体的策略实现类还只是2个,查询红包发放方式写在类RedPaper里边,购物券写在另一个类Shopping里边;那资源类型多个QQ会员和外卖会员,不就得再多写两个类?有点麻烦了。没法俯视整个分派的业务逻辑Map+函数式接口用上了Java8的新特性lambda表达式:
判断条件放在key中对应的业务逻辑放在value中这样子写的服务器租用好处是非常直观,能直接看到判断条件对应的业务逻辑。
需求:根据优惠券(资源)类型 resourceType 和编码 resourceId 查询派发方式grantType。
上代码:
@Service
public class QueryGrantTypeService {
@Autowired
private GrantTypeSerive grantTypeSerive;
private Map
/
*** 初始化业务分派逻辑,代替了if-else部分
* key: 优惠券类型
* value: lambda表达式,最终会获得该优惠券的发放方式
*/
@PostConstruct
public void dispatcherInit(){
grantTypeMap.put("红包",resourceId->grantTypeSerive.redPaper(resourceId));
grantTypeMap.put("购物券",resourceId->grantTypeSerive.shopping(resourceId));
grantTypeMap.put("qq会员",resourceId->grantTypeSerive.QQVip(resourceId));
}
public String getResult(String resourceType){
//Controller根据 优惠券类型resourceType、编码resourceId 去查询 发放方式grantType
Function
if(result!=null){
//传入resourceId 执行这段表达式获得String型的grantType
return result.apply(resourceId);
}
return "查询不到该优惠券的发放方式";
}
}如果单个 if 语句块的业务逻辑有很多行的话,我们可以把这些 业务操作抽出来,写成一个单独的Service,即:
//具体的逻辑操作
@Service
public class GrantTypeSerive {
public String redPaper(String resourceId){
//红包的发放方式
return "每周末9点发放";
}
public String shopping(String resourceId){
//购物券的发放方式
return "每周三9点发放";
}
public String QQVip(String resourceId){
//qq会员的发放方式
return "每周一0点开始秒杀";
}
}入参 String resourceId是用来查数据库的,这里简化了,传参之后不做处理。
用http调用的结果:
@RestController
public class GrantTypeController {
@Autowired
private QueryGrantTypeService queryGrantTypeService;
@PostMapping("/grantType")
public String test(String resourceName){
return queryGrantTypeService.getResult(resourceName);
}
}http调用的结果
用Map+函数式接口也有弊端:
你的队友得会lambda表达式才行啊,当然他不会的让他自己百度去!站群服务器
很赞哦!(21)
上一篇: 为啥修改dns服务器?dns服务器与域名有何联系?
下一篇: 国内域名
相关文章
- 四、一定要仔细阅读细节
- 出售域名要交费用吗?
- 购买域名有哪些需要注意的?
- TechOps、DevOps和NoOps在软件开发生命周期(SDLC)中的作用
- 其次,一般域名注册有一个获取密码的按钮,域名注册商点击后会向您发送密码。在得到域名注册商发送的密码后,将其传输到域名服务提供商网站,然后输入密码,此时域名呈现申请状态。提交申请后,原注册人通常会向您发送一封电子邮件,询问您是否同意转让。此时,您只需点击同意转移按钮,域名注册商就可以成功转移。
- 【紧急】Log4j又发新版2.17.0,只有彻底搞懂RCE漏洞原因,以不变应万变
- 让我们一起学学丑数,你会了吗?
- .cash域名的含义
- 第六:这个圈子里的域名确实是赚钱的一些大玩家,至于小米农,有多少赚钱?几乎没有,也就是说,轿子里只有一个人,而且大多数人都抬着轿子。
- 什么是通用顶级域名?