使用Map+函数式优化if else

使用Map+函数式接口优化if else

工作中遇到一个接口要返回不同数据表中的数据,首先想到的是使用if-else或者switch case:

例如:

	if(("1").equals(dataType)){
           return "1"; 
        }else if(("2").equals(dataType)){
            return "2";
        }else if(("3").equals(dataType)){
            return "3";
        }else if(("4").equals(dataType)){
            return "4";
        }

上只是示例:实际比这更多,意味着的写大量的代码,这里只是简单的示例,实际每个if-else 中并不会这又这一行代码

1.使用策略模式

策略模式是把 if语句里面的逻辑抽出来写成一个类,如果要修改某个逻辑的话,仅修改一个具体的实现类的逻辑即可,增加可维护性。

优点:策略模式在业务逻辑分派的时候还是if-else,比上示例的if-else 更好维护一点。

	if(("1").equals(dataType)){
           return new Context(new dataType1()).ContextInterface(); 
        }else if(("2").equals(dataType)){
            return new Context(new dataType2()).ContextInterface(); 
        }else if(("3").equals(dataType)){
            return new Context(new dataType3()).ContextInterface(); 
        }else if(("4").equals(dataType)){
            return new Context(new dataType4()).ContextInterface(); 
        }

缺点:

如果 if-else的判断情况很多,那么对应的具体策略实现类也会很多,每多一种业务就要多写实现类。
无法看到整个的业务逻辑

2.使用Map+函数式接口优化if else

使用java8的新特性lambda表达式

​ 判断条件发在Map的key上

​ 具体的对应业务逻辑放在Value上

@Service
public class QueryGrantTypeService {

    @Autowired
    private GrantTypeSerive grantTypeSerive;

    private Map<String, Function<String,String>> grantTypeMap = new HashMap<>();

    /**
     * PostConstruct :该注解的作用
     * @PostConstruct是Java自带的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
     * 从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。
     * 执行顺序 Constructor >> @Autowired >> @PostConstruct
     *
     * 初始化业务分派逻辑,代替if-else部分
     * key:优惠券类型
     * value:lambda表达式,最终会获得该优惠券的派发方式
     */
    @PostConstruct
    public void dispatcherInit(){
        grantTypeMap.put("红包",resourceId -> grantTypeSerive.redPaper(resourceId));
        grantTypeMap.put("优惠券",resourceId -> grantTypeSerive.shopping(resourceId));
        grantTypeMap.put("QQVIP",resourceId -> grantTypeSerive.QQVIP(resourceId));
    }

    public String getResult(String resourceType, String resourceId){
        //COntroller根据 优惠券类型resoourceType,编码resourceId 去查询 发放方式grantType
        Function<String, String> result = grantTypeMap.get(resourceType);
        if(result !=null) {
            //传入编码resourceId 执行这段表达式获得String 的grantType
            return result.apply(resourceId);
        }
        return "查询不到该优惠券的发放方式";

    }

可以把if逻辑代码抽出来,每一个业务对应每一个Service,resourceId为业务Id,可以用来查询数据库

@Component
public class GrantTypeSerive  {

    public String redPaper(String resourceId){
        return "红包的派发 每周六晚上六点 ! ! !";
    }

    public String shopping(String resourceId){
        return "优惠券的派发 每周二晚上六点 ! ! !";
    }

    public String QQVIP(String resourceId){
        return "QQVIP派发 每月一日早上八点 ! ! !";
    }
}

接口实现

@RestController
public class WavesController {
    @Autowired
    private QueryGrantTypeService queryGrantTypeService;

    @PostMapping("/getGrantType")
    public AjaxResult getResult(){
       String res = queryGrantTypeService.getResult("QQVIP","1001");
       String res2 = queryGrantTypeService.getResult("优惠券","1002");
        Map<String,Object> map  = new HashMap<>();
        map.put("res",res);
        map.put("res2",res2);
       return AjaxResult.success(map);
    }

返回结果

posted @ 2023-03-25 14:02  旧歌  阅读(290)  评论(0编辑  收藏  举报