Java8 IF ELSE IF 优化

text
1 2 3
<a href="#_2">现象</a>    <a href="#_6">解决方式</a>    
 
  <a href="#if_else_if_7">if else if</a>      <a href="#switch_case_18">switch case</a>      <a href="#_35">弊端</a>      <a href="#Java8_39">Java8的实现</a>            

现象

在程序中总会看到或者碰到很多根据key判断要执行的方法代码等等;
简单流程示意图

解决方式

if else if

text
1 2 3 4 5 6 7
if(StringUtils.equals(key,"1")){
    //逻辑1
} else if (StringUtils.equals(key,"2")){
    //逻辑2
}
//...类型越多代码越繁多

switch case

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14
    switch (key){
    case "1":
       //逻辑1
       break;
    case "2":
       //逻辑2
       break;
    /*
    ...
     */
    default:
       //默认处理
    }

弊端

类型越多代码越多, 维护不易 后来人读起来跳脚骂娘

Java8的实现

直接上代码:

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
@Controller
@RequestMapping("/dc/spring/mvc/ifElse")
public class OptimizationIfElseController {
    /*
      这里多入参可以考虑放到一个实体里面,使用Function
      如果因业务原因必须多入参两个入参使用BiFunction
      再多入参考虑柯里化方式Function<String,BiFunction<String,Map<String, Object>,String>>
      map.put("1",key->(instuCde,param)-> interface(key,instuCde,param));
    */
   Map<String, BiFunction<String,Map<String, Object>,String>> map = new HashMap<>();

   @RequestMapping(value = "/getIfElse/{code}", produces = "text/plain;charset=UTF-8")
   public @ResponseBody String getIfElse(@PathVariable("code") String code) {
      Map< String,Object> map = new HashMap<>();
      map.put("Test1","TestValue");
      return getReturn(code,"Dc",map);
   }
    /**
    * map初始化 构造函数 > @Autowired > @PostConstruct
    */
   @PostConstruct
   public void mapInit(){
      map.put("1",(instuCde,param)-> new OptimizationIfElse1ServiceImpl().testReturn(instuCde,param));
      map.put("2",(instuCde,param)-> new OptimizationIfElse2ServiceImpl().testReturn(instuCde,param));
      map.put("3",(instuCde,param)-> new OptimizationIfElse3ServiceImpl().testReturn(instuCde,param));
   }

   /**
    * 执行程序
    * @param className
    * @param instuCde
    * @param param
    * @return
    */
   private String getReturn(String className,String instuCde, Map<String, Object> param){
      try {
         BiFunction<String,Map<String, Object>,String> function = map.get(className);
         if (Optional.ofNullable(function).isPresent()){
            return function.apply(instuCde,param);
         }
         return "非正常业务逻辑!";
      } catch (Exception e) {
         return "业务异常!";
      }
   }
}

OptimizationIfElse1ServiceImpl ,OptimizationIfElse2ServiceImpl ,OptimizationIfElse3ServiceImpl 代码差不多只是为了测试,不再全部上了

text
1 2 3 4 5 6 7 8
@Service
public class OptimizationIfElse1ServiceImpl implements OptimizationIfElseService {
   @Override
   public String testReturn(String instuCde, Map<String, Object> param) {
      return StrUtil.format("测试类1【{}】{}",instuCde, JSONObject.toJSONString(param));
   }
}

执行结果
运行1结果
运行2结果
运行3结果
非业务逻辑结果
Java8的这种方式看着比较优雅,比策略模式看上去更简易,而且阅读起来,各种key要执行的方法在初始化的时候看起来一目了然,更容易理解。
共勉!

原文地址:https://blog.csdn.net/Dc253061007/article/details/107122697?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168474994416800226590860%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168474994416800226590860&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-26-107122697-null-null.142^v87^control_2,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96