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

news2024/12/28 5:25:47

前言 

在我看来多写几个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.coloradmin.cn/o/2266762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

现代网络负载均衡与代理导论

大家觉得有有参考意义和帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; Service mesh 是近两年网络、容器编排和微服务领域最火热的话题之一。Envoy 是目前 service mesh 数据平面的首选组件。Matt Klein 是 Envoy 的设计者和核心开发。 文章循序渐进&#xff0…

Kubernetes Gateway API-2-跨命名空间路由

1 跨命名空间路由 Gateway API 具有跨命名空间路由的核心支持。当多个用户或团队共享底层网络基础设施时,这很有用,但必须对控制和配置进行分段,以尽量减少访问和容错域。 Gateway 和 Route(HTTPRoute,TCPRoute,GRPCRoute) 可以部署到不同的命名空间中,路由可以跨命名空间…

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构&#xff1a;List、Set和Queue。本文将详细阐述这些数据类型的各自实现&#xff0c;并按照线程安全性进行分类&#xff0c;分别介绍非线程安全与线程安全的实现方…

集成方案 | Docusign + 蓝凌 EKP,打造一站式合同管理平台,实现无缝协作!

本文将详细介绍 Docusign 与蓝凌 EKP 的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 在当今数字化办公环境中&#xff0c;企业对于提高工作效率和提升用户体验的需求日益迫切。蓝凌…

突围边缘:OpenAI开源实时嵌入式API,AI触角延伸至微观世界

当OpenAI宣布开源其名为openai-realtime-embedded-sdk的实时嵌入式API时&#xff0c;整个科技界都为之震惊。这一举动意味着&#xff0c;曾经遥不可及的强大AI能力&#xff0c;如今可以被嵌入到像ESP32这样的微型控制器中&#xff0c;真正地将AI的触角延伸到了物联网和边缘计算…

webrtc-internals调试工具

Google 的 Chrome&#xff08;87 或更高版本&#xff09;WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具; webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。 webrtc-int…

使用Webpack构建微前端应用

英文社区对 Webpack Module Federation 的响应非常热烈&#xff0c;甚至被誉为“A game-changer in JavaScript architecture”&#xff0c;相对而言国内对此热度并不高&#xff0c;这一方面是因为 MF 强依赖于 Webpack5&#xff0c;升级成本有点高&#xff1b;另一方面是国内已…

[bug]java导出csv用Microsoft Office Excel打开乱码解决

[bug]java导出csv用Microsoft Office Excel打开乱码 ‍ 现象 首先这个csv文件用macbook自带的 "Numbers表格" 软件打开是不乱码的, 但是使用者是Windows系统,他的电脑没有"Numbers表格"工具, ​​ 他用Microsoft Office Excel打开之后出现乱码,如下图…

关于分布式数据库需要了解的相关知识!!!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于关于分布式数据库方面的相关内容&a…

tortoisegit推送失败

tortoisegit推送失败 git.exe push --progress -- "origin" testLidar:testLidar /usr/bin/bash: gitgithub.com: No such file or directory fatal: Could not read from remote repository. Please make sure you have the correct access rights and the reposit…

moviepy将图片序列制作成视频并加载字幕 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

清空DNS 缓存

如果遇到修改了host文件&#xff0c;但是IP和域名的映射有问题的情况&#xff0c;可以尝试刷新DNS缓存。 ipconfig/flushdns win建加R建&#xff0c;然后输入cmd&#xff0c;然后回车 然后回车&#xff0c;或者点击确定按钮。 出现如下所示标识清空DNS 缓存成功。

2024最新鸿蒙开发面试题合集(二)-HarmonyOS NEXT Release(API 12 Release)

上一篇面试题链接&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/144685078 1. 鸿蒙简单介绍和发展历程 HarmonyOS 是新一代的智能终端操作系统&#xff0c;为不同设备的智能化、互联与协同提供了统一的语言。带来简洁&#xff0c;流畅&#xff0c;连续&#xff0…

Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制

引言 在嵌入式开发中&#xff0c;构建效率直接影响项目的开发进度和质量。Yocto 项目通过其核心工具 BitBake 提供了灵活而强大的构建能力。然而&#xff0c;OpenEmbedded 构建系统的传统设计是从头开始构建所有内容&#xff08;Build from Scratch&#xff09;&#xff0c;这…

idea 8年使用整理

文章目录 前言idea 8年使用整理1. 覆盖application配置2. 启动的时候设置编辑空间大小&#xff0c;并忽略最大空间3. 查询类的关系4. 查看这个方法的引用关系5. 查看方法的调用关系5.1. 查看被调用关系5.2. 查看调用关系 6. 方法分隔线7. 选择快捷键类型8. 代码预览插件9. JReb…

04软件测试需求分析案例-用户登录

通读文档&#xff0c;提取信息&#xff0c;提出问题&#xff0c;整理为需求。 从需求规格说明、设计说明、配置说明等文档获取原始需求&#xff0c;通读原始需求&#xff0c;分析有哪些功能&#xff0c;每种功能要完成什么业务&#xff0c;业务该如何实现&#xff0c;业务逻辑…

【MySQL】踩坑笔记——保存带有换行符等特殊字符的数据,需要进行转义保存

问题描述 从DBeaver中导出了部分业务数据的 insert sql&#xff0c;明明在开发、测试环境都可以一把执行通过&#xff0c;却在预发环境执行前的语法检查失败了&#xff0c;提示有SQL语法错误。 这条SQL长这样&#xff0c;default_sql是要在odps上执行的sql语句&#xff0c;提…

windos挂载目录到linux

验证环境麒麟V10 1: 在windows任意目录设置共享文件夹 2&#xff1a;记住网络路径\LAPTOP-86JV6NT1\gantie13_sdk 在linux中替换为本机ip级相对路径 比如本级ip是192.168.23.23&#xff0c;linux环境需要ping通本地地址 3&#xff1a; sudo apt-get install cifs-utils sud…

springboot494基于java的综合小区管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统综合小区管理系统信息管理难度大&#xff0c;容错率低&am…

数据分析篇001

目录 一、数据是什么&#xff1f; 二、数据能做什么&#xff1f; 三、数据应用四步骤 第一步---搭建数据体系 第二步---积累数据资产 第三步---完成数据分析 第四步---实现数据应用 四、数据的三种性质 变异性 规律性&#xff08;以正态分布为例&#xff09; 客观性…