首页 > 其他分享 >使用Map+函数式优化if else

使用Map+函数式优化if else

时间:2023-03-25 14:12:19浏览次数:36  
标签:Map return String resourceId else new public 函数

使用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);
    }

返回结果

标签:Map,return,String,resourceId,else,new,public,函数
From: https://www.cnblogs.com/wdyjt/p/17254643.html

相关文章

  • feature map 的理解与处理
    特征理解不变性和等变性是图像特征表示的两个重要性质。分类需要不变特征表示,因为它的目标是学习高级语义信息。目标定位要求等变表示,因为它的目的是鉴别位置和尺度的变......
  • feature map-CAM 和 利用pytorch-hook注册实现CAM可视化
    什么是CAMCAM的全称是ClassActivationMapping或ClassActivationMap,即类激活映射或类激活图。论文《LearningDeepFeaturesforDiscriminativeLocalization》发......
  • feature map-opencv实现特征热力图可视化
    上代码绿色底纹部分代表单个通道热力图生成代码;importcv2importtimeimportosimportmatplotlib.pyplotaspltimporttorchfromtorchimportnnimportt......
  • 算法分析与设计——冒泡排序,选择排序,STL自带sort函数性能比较实验
    实验环境:Win11,Devc++5.11实验方法:生成不同数据量的随机数后使用三种排序方法分别排序,比较每种方法所耗时长。实验结果:数据量为1000时,冒泡排序平均用时为0.015s,选择排序平......
  • Bitmap读取本地高分辨率图片报内存不足的解决方案
    1#regiongetThumImage生成缩略图2///<summary>3///生成缩略图4///</summary>5///<paramname="sourceFile">原始图......
  • Arcmap出现拓扑无效问题怎么解决
    在ArcMap中出现拓扑无效错误通常是由于要素类之间存在空间关系不一致或拓扑错误导致的。以下是几种可能的解决方案:运行“检查几何”工具,以确定是否存在几何错误。如果有几......
  • c语言部分系统调用函数(shell编程)
    头文件<fcntl.h>文件控制<unistd.h>符号常量<sys/stat.h>文件状态<sys/types.h>基本系统数据类型<utime.h>文件时间<dirent.h>目......
  • 基于隶属度函数模糊CMAC神经网络算法matlab仿真
    1.算法描述       CMAC神经网络具有小脑的机能,因而,被广泛应用于机器人的运动控制。或者反过来说,正是为了机器人的运动控制,Albus构造了CMAC神经系统,以模拟脊椎动物......
  • 【C】内存操作函数
    继字符函数与字符串函数(下)本章来介绍一组内存操作函数,内容如下:内存操作函数mon-memory记忆即内存memcpymemmovememsetmemcmp这些函数头文件都是#include<st......
  • go 笔记 init函数
    来自:goinit函数1、golang里的main函数是程序的入口函数,olang还有另外一个特殊的函数init函数,先于main函数执行init函数的主要作用:初始化不能采用初始化表达式初始化的......