Map+函数式接口

简介: Map+函数式接口

1.用上了Java8的新特性lambda表达式

判断条件放在key中

对应的业务逻辑放在value中

这样子写的好处是非常直观,能直接看到判断条件对应的业务逻辑

2.需求:根据优惠券(资源)类型resourceType和编码resourceId查询派发方式grantType

3.代码

————————————————

@Service
public class QueryGrantTypeService {

@Autowired  
private GrantTypeSerive grantTypeSerive;  
private Map<String, Function<String,String>> grantTypeMap=new HashMap<>();  

/**  
 *  初始化业务分派逻辑,代替了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<String,String> result=getGrantTypeMap.get(resourceType);  
    if(result!=null){  
     //传入resourceId 执行这段表达式获得String型的grantType  
        return result.apply(resourceId);  
    }  
    return "查询不到该优惠券的发放方式";  
}  

}

3.1 如果单个 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点开始秒杀";  
}  

}

3.2 用http调用的结果:

@RestController
public class GrantTypeController {

@Autowired  
private QueryGrantTypeService queryGrantTypeService;  

@PostMapping("/grantType")  
public String test(String resourceName){  
    return queryGrantTypeService.getResult(resourceName);  
}  

}

4.1 总结:策略模式通过接口、实现类、逻辑分派来完成,把 if语句块的逻辑抽出来写成一个类,更好维护。

4.2 Map+函数式接口通过Map.get(key)来代替 if-else的业务分派,能够避免策略模式带来的类增多、难以俯视整个业务逻辑的问题。

相关文章
|
2月前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
32 1
|
4月前
|
安全 Java
【Java集合类面试三】、Map接口有哪些实现类?
这篇文章介绍了Java中Map接口的几种常用实现类:HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap,以及它们适用的不同场景和线程安全性。
|
6月前
|
存储 算法 Java
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
【6月更文挑战第19天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
51 3
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
|
5月前
|
Java
Java Map.Entry接口详解
Java Map.Entry接口详解
|
7月前
|
存储 Java
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
|
6月前
|
安全 Java
Map`接口的`compute`方法
Map`接口的`compute`方法
|
7月前
|
存储 安全 Java
Java的Map接口及其实现类的技术性文章
Java的Map接口及其实现类的技术性文章
58 0
|
7月前
|
存储 安全 Java
Java list set map等接口及其实现类
Java list set map等接口及其实现类
|
7月前
|
存储 安全 Java
Java一分钟之-Map接口与HashMap详解
【5月更文挑战第10天】Java集合框架中的`Map`接口用于存储唯一键值对,而`HashMap`是其快速实现,基于哈希表支持高效查找、添加和删除。本文介绍了`Map`的核心方法,如`put`、`get`和`remove`,以及`HashMap`的特性:快速访问、无序和非线程安全。讨论了键的唯一性、`equals()`和`hashCode()`的正确实现以及线程安全问题。通过示例展示了基本操作和自定义键的使用,强调理解这些概念对编写健壮代码的重要性。
48 0
|
3月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19