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 {@Autowiredprivate WebClientServer webClientServer;@Overridepublic String getCode() {return "IST-PR1";}@Overridepublic 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);// 获取地址addressString 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) {// 对象转换为xmlreturn 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.rhkb.cn/news/496568.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录Day51 99. 岛屿数量,99. 岛屿数量,100. 岛屿的最大面积。

1.岛屿数量深搜 卡码网题目链接&#xff08;ACM模式&#xff09;(opens new window) 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接…

邮箱手机号脱敏

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 输入框的脱敏&#xff0c;当输入的时候显示正常&#xff0c;失去焦点部分显示**** 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 脱敏可以封装 一下成为一个方法&#xff0c;挂…

C语言----变量与常量

目录 变量 变量的分类 常量 分类&#xff1a; 1. 字符型常量 2. 字符串常量 3. 整形常量 4. 浮点型常量 5. 指数常量 6. 标识常量 变量 概念&#xff1a;在程序运行中发生改变的量 定义格式&#xff1a; 存储类型(一般存储类型是可以省略的) 数据类型 变量名 aut…

SQLite本地数据库的简介和适用场景——集成SpringBoot的图文说明

前言&#xff1a;现在项目普遍使用的数据库都是MySQL&#xff0c;而有些项目实际上使用SQLite既足矣。在一些特定的项目中&#xff0c;要比MySQL更适用。 这一篇文章简单的介绍一下SQLite&#xff0c;对比MySQL的优缺点、以及适用的项目类型和集成SpringBoot。 1. SQLite 简介 …

线性代数行列式

目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得&#xff1a;分…

闲谭Scala(3)--使用IDEA开发Scala

1. 背景 广阔天地、大有作为的青年&#xff0c;怎么可能仅仅满足于命令行。 高端大气集成开发环境IDEA必须顶上&#xff0c;提高学习、工作效率。 开整。 2. 步骤 2.1 创建工程 打开IDEA&#xff0c;依次File-New-Project…&#xff0c;不好意思我的是中文版&#xff1a;…

http 请求总结get

关于get请求传递body的问题 错误代码 有400 , 415 等情况 <!doctype html><html lang"zh"><head><title>HTTP Status 400 – 错误的请求</title><style type"text/css">body {font-family:Tahoma,Arial,sans-seri…

CCF-GESP 等级考试 2023年12月认证C++五级真题解析

2023年12月真题 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 正确答案&#xff1a;C 考察知识点&#xff1a;算法 解析&#xff1a;fiboA 是很好理解的&#xff0c;但是执行效率不高&#xff0c;有的计算是重复的&#xff0c;导致效率低。 正确答案&#xf…

Vscode + gdbserver远程调试开发板指南:

本章目录 步骤环境准备网络配置vscode配置步骤 (全图示例)开发板配置开始调试注意: 每次断开之后&#xff0c;开发板都需要重新启动gdbserver才可调试。 参考链接: 步骤 环境准备 将交叉编译链路径加入$PATH变量&#xff1a;确保系统能够找到所需的工具。 export PATH$PATH:/p…

Docker【初识Docker】

目录 为什么会出现Docker这门技术喃&#xff1f; 应用开发和部署的困境 容器技术的先兆 Docker 的出现&#xff1a;简化容器化 Docker 技术的关键创新&#xff1a; Docker 的广泛应用和变革 什么是 Docker&#xff1f; Docker的历史 早期背景&#xff1a;容器化和虚拟化…

金融租赁系统的发展与全球化战略实施探讨

内容概要 金融租赁系统的演变并非一帆风顺&#xff0c;像一场跌宕起伏的电影。首先&#xff0c;咱们得看看它的起源及现状。随着经济的快速发展&#xff0c;金融租赁逐渐作为一种灵活的融资手段崭露头角。在中国市场中&#xff0c;企业对设备和技术更新换代的需求日益迫切&…

畅游 Linux 开发天地:yum 与 vim 详解

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 前言 在当今数字…

C++--------继承

一、继承的基本概念 继承是 C 中的一个重要特性&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。 #include <iostream>// 基类 class Base…

Doris的SQL原理解析

今天来介绍下Doris的SQL原理解析&#xff0c;主要从语法、解析、分析、执行等几个方面来介绍&#xff0c;可以帮助大家对Doris底层有个清晰的理解~ 一、Doris简介 Apache Doris是一个基于MPP架构的高性能、实时的分析型数据库&#xff0c;能够较好的满足报表分析、即席查询、…

HarmonyOS NEXT 实战之元服务:静态多案例效果(一)

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1代码案例如下&#xff1a; import { authentication } from…

Elasticsearch:normalizer

一、概述 ‌Elastic normalizer‌是Elasticsearch中用于处理keyword类型字段的一种工具&#xff0c;主要用于对字段进行规范化处理&#xff0c;确保在索引和查询时保持一致性。 Normalizer与analyzer类似&#xff0c;都是对字段进行处理&#xff0c;但normalizer不会对字段进…

零基础微信小程序开发——页面导航之编程式导航(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

计算机网络 (10)网络层

前言 计算机网络中的网络层&#xff08;Network Layer&#xff09;是OSI&#xff08;开放系统互连&#xff09;模型中的第三层&#xff0c;也是TCP/IP模型中的第二层&#xff0c;它位于数据链路层和传输层之间。网络层的主要任务是负责数据包从源主机到目的主机的路径选择和数据…

云计算时代携程的网络架构变迁

大家觉得有意义和帮助记得及时关注和点赞!!! 前言关于我0 关于携程云 网络演进时间表1 个基于 VLAN 的 L2 网络 1.1 要求1.2 解决方案&#xff1a;OpenStack Provider Network Model1.3 硬件网络拓扑1.4 主机网络拓扑1.5 总结 优势劣势2 个基于 SDN 的大型 L2 网络 2.1 新挑战2…

C#控件开发3—文本显示、文本设值

目录 1.文本设置1&#xff09;定义属性2&#xff09;定义事件 2.本文显示1) 定义属性2&#xff09;定义事件 End 如何绘制一个便捷的文本显示组件、文本设值组件&#xff08;TextShow,TextSet&#xff09;&#xff1f; 绘制此控件的目的就是方便一键搞定标签显示&#xff08;可…