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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/943159.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编程初学者使用 MariaDB 数据库反射生成

编程初学者使用 MariaDB 数据库反射生成 数据库反射生成&#xff0c;是动词算子式通用代码生成器提供的高级功能&#xff0c;可以利用已有的数据库&#xff0c;反射生成相应数据库的前端和后端项目。此功能自动化程度很高&#xff0c;并且支持完善的元数据和数据编辑&#xff…

机器人加装电主轴【铣削、钻孔、打磨、去毛刺】更高效

机器人加装电主轴进行铣削、钻孔、打磨、去毛刺等作业&#xff0c;展现出显著的优势&#xff0c;并能实现高效加工。 1. 高精度与高效率 电主轴特点&#xff1a;高速电主轴德国SycoTec的产品&#xff0c;转速可达100000rpm&#xff0c;功率范围广&#xff0c;精度≤1μm&#…

RCCL/NCCL中的Transports方式选择:P2P or SHM or NET

本篇文章主要总结以下在传输路径方式选择的时候&#xff0c;选择每一种方式应该满足的条件和优先度。 本文初步总结&#xff0c;之后还会进行更新&#xff0c;欢迎大家补充 源码位置&#xff1a;tools/topo_expl Topo结构&#xff1a; 初始化判断前 ret设置为0&#xff0c;代…

upload-labs关卡记录11

先上传一个一句话木马试试&#xff0c;居然可以上传成功&#xff0c;复制图片链接&#xff0c;在另一个窗口打开&#xff1a; 会发现&#xff0c;我们明明上传的是shell.php&#xff0c;但是这里就是没有了php,这样我们在执行我们相关的语句的时候就无法执行了&#xff1a; 就…

elementUI——upload限制图片或者文件只能上传一个——公开版

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff0c;就是上传图片&#xff0c;有且仅能上传一张。 效果图如下&#xff1a; 功能描述&#xff1a;上传图片时&#xff0c;仅支持单选&#xff0c;如果上传图片成功后&#xff0c;展示图片&#xff0c;并隐藏添加图片的…

springboot餐厅点餐系统丨源码+数据库+万字文档+PPT

作者简介&#xff1a; 作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 技术框架 开发语言&#xff1a;Java 框架&#xff1a;springbo…

ArkTs组件(2)

一.下拉列表组件&#xff1a;Select 1.接口 Select(options: Array<SelectOption>) 参数名类型必填说明optionsArray<SelectOption>是设置下拉选项。 SelectOption对象说明 名称类型必填说明valueResourceStr是 下拉选项内容。 iconResourceStr否 下拉选项图片…

【MATLAB第110期】#保姆级教学 | 基于MATLAB的PAWN全局敏感性分析方法(无目标函数)含特征变量置信区间分析

【MATLAB第110期】#保姆级教学 | 基于MATLAB的PAWN全局敏感性分析方法&#xff08;无目标函数&#xff09;含特征变量置信区间分析 一、介绍 PAWN&#xff08;Probabilistic Analysis With Numerical Uncertainties&#xff09;是一种基于密度的全局敏感性分析&#xff08;Gl…

请购单一直提示需求部门不能为空无法提交

终于发现了它的逻辑。用户很多次反馈&#xff0c;提交请购单时&#xff0c;提示需求部门不能为空&#xff0c;既使选择了需求部门&#xff0c;保存时&#xff0c;神奇的是会清空掉部门的信息&#xff0c;提交时就会有错误提示出来。 原因&#xff1a;光选择单头上的需求部门是…

leetcode 面试经典 150 题:矩阵置零

链接矩阵置零题序号73题型二维数组解题方法标记数组法难度中等熟练度✅✅✅✅ 题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1]…

AIGC:生成图像动力学

文章目录 前言一、介绍二、方法2.1、运动预测模块运动纹理 2.2、图像渲染模块 三、数据集实验总结 前言 让静态的风景图能够动起来真的很有意思&#xff0c;不得不说CVPR2024 best paper实质名归&#xff0c;创意十足的一篇文章&#xff01;&#xff01;&#xff01; paper&a…

python: Oracle Stored Procedure query table

oracel sql script CREATE OR REPLACE PROCEDURE SelectSchool(paramSchoolId IN char,p_cursor OUT SYS_REFCURSOR ) AS BEGINOPEN p_cursor FORSELECT *FROM SchoolWHERE SchoolId paramSchoolId; END SelectSchool; /-- 查询所有 CREATE OR REPLACE PROCEDURE SelectScho…

社区版Dify 轻松实现文生图,Dify+LLM+ComfyUI

社区版Dify 轻松实文生图&#xff0c;DifyLLMComfyUI Dify 安装可参考这里ComfyUI 其实 比 WebUI更简单更实用DifyComfyUIDifyLLM1. Qwen 通义千问大模型系列2. OpenAI大模型系列3. 本地Ollama搭建 DifyLLMComfyUI Dify 安装可参考这里 这是一个在Dify上实现 文生图的教程&…

Docker部署Sentinel

一、简介 是什么&#xff1a;面向分布式、多语言异构化服务架构的流量治理组件 能干嘛&#xff1a;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 官网地址&#xff1a;https://sentinelguard.io/zh-c…

实用工具推荐----Doxygen使用方法

目录 目录 1 软件介绍 2 Doxygen软件下载方法 3 Doxygen软件配置方法 4 标准注释描述 4.1 块注释 和 特殊描述字符 4.1.1 函数描述示例 4.1.2结构体数组变量示例 特别注意&#xff1a; 4.2单行注释 4.2.1 单个变量注释示例 特别注意&#xff1a; 4.2.2对于枚举变量…

并发编程 - 死锁的产生、排查与解决方案

在多线程编程中&#xff0c;死锁是一种非常常见的问题&#xff0c;稍不留神可能就会产生死锁&#xff0c;今天就和大家分享死锁产生的原因&#xff0c;如何排查&#xff0c;以及解决办法。 线程死锁通常是因为两个或两个以上线程在资源争夺中&#xff0c;形成循环等待&#xf…

云轴科技ZStack获评OpenCloudOS社区2024年度优秀贡献单位

近日&#xff0c;由 OpenCloudOS 社区主办的 2024 OpenCloudOS 年会在北京成功召开。本次大会以“稳建基石&#xff0c;共创新篇”为主题&#xff0c;汇集了业界顶级技术专家与行业领袖&#xff0c;共同探讨下一代操作系统的建设与未来。云轴科技ZStack作为OpenCloudOS 社区的重…

clickhouse解决suspiciously many的异常

1. 问题背景 clickhouse安装在虚拟机上&#xff0c;持续写入日志时&#xff0c;突然关机&#xff0c;然后重启&#xff0c;会出现clickhouse可以正常启动&#xff0c;但是查询sql语句&#xff0c;提示suspiciously many异常&#xff0c;如图所示 2. 问题修复 touch /data/cl…

从零开始k8s-部署篇(未完待续)

从零开始k8s 1.部署k8s-部署篇 1.部署k8s-部署篇 本次部署完全学习于华子的博客点击此处进入华子主页 K8S中文官网&#xff1a;https://kubernetes.io/zh-cn 笔者从零开始部署的k8s&#xff0c;部署前置条件为 1.需要harbor仓库&#xff0c;存放镜像&#xff0c;拉取镜像&am…

Dots 常用操作

游戏中有多个蚂蚁群落&#xff0c;每个蚂蚁属于一个群落&#xff0c;如何设计数据结构&#xff1f; 方法1&#xff1a;为蚂蚁组件添加一个属性 ID&#xff0c;会造成逻辑中大量分支语句&#xff0c;如果分支语句逻辑不平衡可能带来 Job 调度问题&#xff0c;每个蚂蚁会有一份蚂…