当前位置: 首页 > article >正文

Java中处理if-else的几种高级方法

前言 

在我看来多写几个if-else没啥大不了的,但是就是看起来没啥逼格,领导嫌弃。我根据开发的经历写几个不同的替代方法

一、枚举法替代 

我先前写了一篇文章,可以去看看。

通过枚举替换if-else语句的解决方案_枚举代替if else c语言-CSDN博客

二、定义接口,实现类

通过定义初始方法,通过添加多个实现类来选择

  • 接口

public interface ISoapServer {

    /**
     * 服务编码
     * @return
     */
    String getCode();

    /**
     * 服务
     * @param xml
     * @return
     */
    String server(String xml);

}
  • 实现类

 其中一个实现类,其他的类似


import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import us.codecraft.webmagic.selector.Html;

import java.util.List;

/**
 * @author HuangZheng
 * @create 2023-05-05 9:49
 * @description 居民信息提交服务
 */
@Service
public class Soap06IstPr1 implements ISoapServer {

    @Autowired
    private WebClientServer webClientServer;

    @Override
    public String getCode() {
        return "IST-PR1";
    }

    @Override
    public String server(String xml) {
        try {
            if (StrUtil.isBlank(xml)) {
                throw new BaseException("参数不能为空!");
            }

            // 要插入的业务表
            Patient patient = new Patient();
            String pid = IdUtil.fastSimpleUUID();
            patient.setPid(pid);
            // 第一步 解析参数
            Html requestXml = Html.create(xml);
            // 获取身份证号
            // 1、从开头寻找
            List<String> idNoList = requestXml.xpath("//personInfo/identifier/value/@value").all();
            // 2、从assignedPerson节点寻找
            List<String> tempIdNoList = requestXml.xpath("//assignedPerson/identifier/value/@value").all();
            idNoList.addAll(tempIdNoList);
            for (String s : idNoList) {
                if (IdcardUtil.isValidCard(s)) {
                    patient.setIdNo(s);
                    patient.setIdTypeCode("01");
                    patient.setIdTypeName("身份证");
                    // 只要能取到一个就行
                    break;
                }
            }
            // 姓名
            final String name = requestXml.xpath("//personInfo/assignedPerson/name/@value").get();
            patient.setName(name);
            // 性别
            final String sexCode = requestXml.xpath("//personInfo/assignedPerson/gender/@value").get();
            patient.setSexCode(sexCode);
            ExceptionUtil.soapExcpition("1",name);
            ExceptionUtil.soapExcpition("2",sexCode);
            final String sexName = XmlReadUtil.getRangeByKey("GB/T 2261.1-2003", sexCode).getValue();
            patient.setSexName(sexName);

            // 手机号码
            String telNo = requestXml.xpath("//personInfo/telecom/value/@value").get();
            patient.setTelNo(telNo);

            // 获取地址address
            String presentAddress = requestXml.xpath("//personInfo/address/text/@value").get();
            String presentAddrProvi = requestXml.xpath("//personInfo/address/state/@value").get();
            String presentAddrCity = requestXml.xpath("//personInfo/address/city/@value").get();
            String presentAddrCounty = requestXml.xpath("//personInfo/address/district/@value").get();
            String presentAddrTown = requestXml.xpath("//personInfo/address/town/@value").get();
            String presentAddrVillage = requestXml.xpath("//personInfo/address/street/@value").get();
            String presentAddrHouNo = requestXml.xpath("//personInfo/address/houseNumber/@value").get();
            // 存值
            patient.setPresentAddress(TextUtil.getStr(presentAddress, "-"));
            patient.setPresentAddrProvi(TextUtil.getStr(presentAddrProvi, "-"));
            patient.setPresentAddrCity(TextUtil.getStr(presentAddrCity, "-"));
            patient.setPresentAddrCounty(TextUtil.getStr(presentAddrCounty, "-"));
            patient.setPresentAddrTown(TextUtil.getStr(presentAddrTown, "-"));
            patient.setPresentAddrVillage(TextUtil.getStr(presentAddrVillage, "-"));
            patient.setPresentAddrHouNo(TextUtil.getStr(presentAddrHouNo, "-"));

            // 出生日期
            final String birthday = requestXml.xpath("//personInfo/assignedPerson/birthTime/@value").get();
            patient.setBirthday(Convert.toDate(birthday));

            // 婚姻状况
            final String marCode = requestXml.xpath("//personInfo/assignedPerson/maritalStatusCode/@value").get();
            patient.setMarCode(marCode);
            final String marName = XmlReadUtil.getRangeByKey("GB/T 2261.2-2003", marCode).getValue();
            patient.setMarName(marName);

            // ORG_ID 通过最后的机构名称查询
            String orgName = requestXml.xpath("//personInfo/assignedOrganization/name/@value").get();
            OrgMapper orgMapper = SpringUtils.getBean(OrgMapper.class);
            Org org = orgMapper.selectOne(new LambdaQueryWrapper<Org>().eq(Org::getManagerorgname, orgName));
            if (org != null) {
                patient.setOrgId(org.getOrgid());
            }else{
                patient.setOrgId("1");
            }

            // 批次
            String batchId = UUID.randomUUID(false).toString(true);
            patient.setBatchId(batchId);

            PatientMapper patientMapper = SpringUtils.getBean(PatientMapper.class);
            patientMapper.insert(patient);
            //保存通知
            List<String> ids = webClientServer.saveNoice(new String[][]{
                    {"rhin:personRecordRevise",name+"居民信息发生变更"}
                    ,{"rhin:personIdentifierRevise",name+"居民信息索引变更"}
                    ,{"rhin:personIdentifierMerge",name+"居民信息合并"}
            });
            //检查是否有主题订阅,如有发送通知
            webClientServer.checkAndNoice(ids);
            return "<PersonRecordFeedResponse>\n" +
                    "         <masterIdentifer>" +
                    TextUtil.format("<system value=\"{}\"/> \n", "") +
                    TextUtil.format("<value value=\"{}\"/> \n", pid) +
                    "         </masterIdentifer>\n" +
                    "</PersonRecordFeedResponse>";

        } catch (Exception e) {
            // 对象转换为xml
            return TextUtil.format("" +
                    "<returnData>\n" +
                    "\t<funCode>{}</funCode>\n" +
                    "\t<errorCode>{}</errorCode>\n" +
                    "\t<detail>{}</detail>\n" +
                    "</returnData> \n", getCode(), "500", e.getCause() != null ? e.getCause() : e.getMessage());
        }
    }
}

 使用方法

 public String HIPMessageServer(String action, String message) {
        String result ="";
        log.info("\n 交互服务入参信息: \n action:{} \n message:{}",action,message);
        String[] beanNamesForType = applicationContext.getBeanNamesForType(ISoapServer.class);
        for (String beanName : beanNamesForType) {
            ISoapServer soapServer = applicationContext.getBean(beanName, ISoapServer.class);
            if (soapServer.getCode().equals(action)) {
                result = soapServer.server(message);
                log.info("\n 交互服务出参信息: \n message:{}",result);
                return result;
            }
        }
        return result;
    }

三、Map+函数式接口

@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点开始秒杀";  
    }  
} 
@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 "查询不到该优惠券的发放方式";  
    }  
}


http://www.kler.cn/a/454821.html

相关文章:

  • 探索基金聚合平台的背景与发展:Finanzen.net、Franklin Templeton、Finect
  • Animated Drawings:让纸上的角色动起来
  • 电子电气架构 --- 什么是自动驾驶技术中的域控制单元(DCU)?
  • 阿里云新用户服务器配置
  • TDengine 新功能 VARBINARY 数据类型
  • ArcGIS土地利用数据制备、分析及基于FLUS模型土地利用预测(数据采集、处理、分析、制图)
  • 用Excel表格在线发布期末考试成绩单
  • USB免驱IC读写器QT小程序开发
  • 计算机网络 (9)数据链路层
  • 深度学习在图像识别中的最新进展与实践案例
  • 如何在 Vue 中处理 API 请求?
  • 第3章 并行循环调度的准则
  • c++ 打开摄像头并显示摄像头捕获的数据
  • 【进阶编程】代理模式和适配模式的比较
  • 【视觉惯性SLAM:八、ORB-SLAM2:特征匹配】
  • 外键约束的应用层维护
  • Spring Boot 自动配置:从 spring.factories 到 AutoConfiguration.imports
  • PlantUML 入门使用指南
  • Llama 3 后训练(三)
  • 逻辑控制语句
  • 【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData
  • fisco-bcos手动部署区块链浏览器
  • 【Leetcode】3159. 查询数组中元素的出现位置
  • 顶会评测集解读-AlignBench: 大语言模型中文对齐基准
  • 什么是Top-p采样与Top-k采样?大模型推理时如何同时设置?解析Transformers库源代码
  • 智能合约在Web3中的作用:去中心化应用的基石