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

编码技巧:多条件判断拼接字符串

在写代码业务逻辑的时候,有时候需求稍微变化一下都让代码变的很麻烦,如果只在现有代码基础上硬改,可能会让可读性降低,本文通过一个例子来演示字符串拼接的变化。

一开始的业务逻辑比较简单,是固定条件加一个需要判断再追加的条件:

List<String> currentUserDeptIds = getCurrentUserDeptIds();
return "forcetender = 1 " +(currentUserDeptIds.isEmpty() ? "" : " and cdeptid in (" + String.join(",", currentUserDeptIds) + ")");

后来连 forcetender = 1都要变成可选条件时,这里简单的字符串拼接就不可行了,例如改成下面:

String forceTenderPublish = Parameter.get("FORCE_TENDER_PUBLISH");
return ("1".equals(forceTenderPublish) ? "" : "forcetender = 1 ") +(currentUserDeptIds.isEmpty() ? "" : " and cdeptid in (" + String.join(",", currentUserDeptIds) + ")");

上面这种写法中如果 "1".equals(forceTenderPublish) 不满足,前面就是 "",此时如果后面条件满足,拼接时会额外带上 and 导致语法错误,如果不嫌麻烦把 and 改成条件判断就变成了:

String forceTenderPublish = Parameter.get("FORCE_TENDER_PUBLISH");
return ("1".equals(forceTenderPublish) ? "" : "forcetender = 1 ") +(currentUserDeptIds.isEmpty() ? "" : ("1".equals(forceTenderPublish) ? "" : "and ") + " cdeptid in (" + String.join(",", currentUserDeptIds) + ")");

这样倒是能实现功能了,但是不易于阅读,看着就很乱。

我们来看看GitHub Copilot会如何解决上面的变化。

Ask:

getDefaultCondition方法(基于上面第一次改动)最后的return有问题,当前面一个为空时,后面不需要有 and 前缀,请修改正确。

GitHub Copilot:

您的观察是正确的。在当前的实现中,如果forceTenderPublish不等于"1",那么返回的字符串将以" and “开始,这可能会导致SQL查询错误。我们可以通过将所有条件添加到一个列表中,然后使用String.join方法来解决这个问题。这样,只有当列表中有多个元素时,” and "才会被插入。

以下是修改后的getDefaultCondition方法:

String forceTenderPublish = Parameter.get("FORCE_TENDER_PUBLISH");List<String> conditions = new ArrayList<>();
if ("1".equals(forceTenderPublish)) {conditions.add("forcetender = 1");
}List<String> currentUserDeptIds = getCurrentUserDeptIds();
if (!currentUserDeptIds.isEmpty()) {conditions.add("cdeptid in (" + String.join(",", currentUserDeptIds) + ")");
}return String.join(" and ", conditions);

在这个修改后的版本中,我们首先创建一个空的conditions列表。然后,我们检查forceTenderPublish和currentUserDeptIds,如果它们满足条件,我们就将相应的条件添加到列表中。最后,我们使用String.join方法将所有条件连接起来,每个条件之间用" and “分隔。这样,只有当有多个条件时,” and "才会出现。

按照上面的方案,不仅方便我们增加更多的类似条件,而且可读性也大大提高了,遇到类似变化的时候,不能只实现功能,还要考虑易读性和后续可能的变化。

相关文章:

编码技巧:多条件判断拼接字符串

在写代码业务逻辑的时候&#xff0c;有时候需求稍微变化一下都让代码变的很麻烦&#xff0c;如果只在现有代码基础上硬改&#xff0c;可能会让可读性降低&#xff0c;本文通过一个例子来演示字符串拼接的变化。 一开始的业务逻辑比较简单&#xff0c;是固定条件加一个需要判断…...

气压计LPS25HB开发(1)----轮询获取气压计数据

气压计LPS25HB开发----1.轮询获取气压计数据 概述视频教学样品申请源码下载产品特性通信模式速率生成STM32CUBEMX串口配置IIC配置SA0地址设置串口重定向参考程序SA0设置模块地址获取ID复位操作BDU设置设置速率轮询读取数据演示 概述 本文将介绍如何使用 LPS25HB 传感器来读取数…...

这个不需要吗 HttpServletRequest req

这个不需要吗 HttpServletRequest req 在这个特定场景下&#xff0c;您在OnlineStudentFeignService接口中确实不需要直接使用HttpServletRequest对象。因为Feign是一个声明式的HTTP客户端&#xff0c;它的设计目标是简化服务间的远程调用&#xff0c;它并不直接处理原始的HTT…...

【算法与数据结构】深入解析二叉树(一)

文章目录 &#x1f4dd;数概念及结构&#x1f320; 树的概念&#x1f309;树的表示&#x1f320; 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; &#x1f309;二叉树概念及结构&#x1f320;概念&#x1f309;数据结构中的二叉树&#x1f320;特殊的二叉…...

深入浅出:Objective-C中使用MWFeedParser下载豆瓣RSS

摘要 本文旨在介绍如何在Objective-C中使用MWFeedParser库下载豆瓣RSS内容&#xff0c;同时展示如何通过爬虫代理IP技术和多线程提高爬虫的效率和安全性。 背景 随着信息量的激增&#xff0c;爬虫技术成为了获取和处理大量网络数据的重要手段。Objective-C作为一种成熟的编程…...

Java日志框架Log4j 2详解

有时希望能够以文件的形式记录执行过程中出现的异常信息&#xff0c;甚至记录程序正常运行的关键步骤&#xff0c;以便日后查看&#xff0c;那么该如何处理呢? 答:显然&#xff0c;可以自行编程实现这个需求&#xff0c;但是&#xff0c;从更注重效率和性能的方面考虑&#x…...

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本次剪枝实战是基于下面这篇论文去复现的&#xff0c;主要是实现对BN层的γ/gamma进行剪枝操作&#xff0c;本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…...

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…...

git基础命令(二)

目录 git revert 撤消上一次提交的更改但是会创建一个新的提交来撤消该提交所做的更改git show 显示提交详细信息git mv 重命名文件git rm 从工作树和索引中移除文件git clean 从工作树中移除未跟踪文件git checkout 将文件恢复到工作树git reset 撤销更改、移动 HEAD 指针以及…...

从零开始学习typescript系列 1:typescript 基本了解之是什么,为什么,以及怎么用

初识ts 基本了解 设计者&#xff0c;实现者&#xff1a;微软发行时间&#xff1a;2012年10月1日GitHub&#xff1a;https://github.com/microsoft/TypeScriptts和js关系&#xff1a;ts是js的扩展&#xff0c;ts语法包含js ts是新语言吗&#xff1f; 不是&#xff0c;在js基…...

【数学建模】线性规划

针对未来可能的数学建模比赛内容&#xff0c;我对学习的内容做了一些调整&#xff0c;所以先跳过灰色关联分析和模糊综合评价的代码&#xff0c;今天先来了解一下运筹规划类——线性规划模型。 背景&#xff1a; 某数学建模游戏有三种题型&#xff0c;分别是A&#xff0c;B&am…...

MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的通信协议&#xff0c;在物联网和消息传递系统中广泛应用。MQTT 提供了三个不同的 QoS&#xff08;Quality of Service&#xff09;等级&#xff0c;用于确保消息的可靠性和传输效率。本文将详细…...

搭建个人智能家居 3 -第一个设备“点灯”

搭建个人智能家居 3 -第一个外设“点灯” 前言ESPHome点灯 HomeAssistant 前言 前面我们已经完成了搭建这个智能家居所需要的环境HomeAssistant和ESPHome&#xff0c;今天我们开始在这个智能家居中添加我们的第一个设备&#xff08;一颗LED灯&#xff09;&#xff0c;如果环境…...

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

tar -xzf prometheus-2.7.0-rc.1.linux-amd64.tar.gzcd prometheus-2.7.0-rc.1.linux-amd64/./prometheus --config.fileprometheus.yml --web.listen-address:5555 Prometheus 默认监听端口号为 9090&#xff0c;为了不与系统上的其它进程监听端口冲突&#xff0c;我们在启动…...

(delphi11最新学习资料) Object Pascal 学习笔记---第7章第1节(创建对象 )

7.1.4 创建对象 ​ 与其他流行的编程语言比较之后&#xff0c;让我们回到 Pascal&#xff0c;看看如何使用类。 ​ 一旦定义了类&#xff0c;我们就可以创建一个该类型的对象&#xff0c;代码片段如下&#xff08;本节所有代码提取自 Dates1 示例&#xff09;那样&#xff1a…...

unity学习笔记 Restsharp 使用心得

Restsharp Restsharp安装使用注意事项api方式的流式调用--子线程中执行代码无响应的问题问题描述问题解决其他问题 Restsharp 安装 可以在github上下载dll文件然后导入到unity中 https://github.com/adrenak/RestSharp.Unity 也可以百度直接搜Restsharp然后下载相关的文件导入…...

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…...

Python:自动化处理PDF文档集合,提取文献标题、合并文献PDF并生成目录和页码

Python&#xff1a;自动化处理PDF文档集合&#xff0c;提取文献标题、合并文献PDF并生成目录和页码 引言&#xff1a;功能概述步骤一&#xff1a;提取PDF标题步骤二&#xff1a;生成目录和页码&#xff0c;合并PDF技术亮点 代码步骤一&#xff1a;提取PDF标题&#xff08;Step_…...

vue 基于elementUI/antd-vue, h函数实现message中嵌套链接跳转到指定路由 (h函数点击事件的写法)

效果如图&#xff1a; 点击message 组件中的 工单管理&#xff0c; 跳转到工单管理页面。 以下是基于vue3 antd-vue 代码如下&#xff1a; import { message } from ant-design-vue; import { h, reactive, ref, watch } from vue; import { useRouter } from vue-router; c…...

数字排列 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 小明负责公司年会&#xff0c;想出一个趣味游戏: 屏幕给出 1−9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 n 位置…...

转行要趁早!网络安全行业人才缺口大,企业招聘需求正旺

网络安全行业具有人才缺口大、岗位选择多、薪资待遇好、学历要求不高等优势&#xff0c;对于想要转行的人员来说&#xff0c;是一个非常不错的选择。 人才缺口大 网络安全攻防技术手段日新月异&#xff0c;特别是现在人工智能技术飞速发展&#xff0c;网络安全形势复杂严峻&am…...

卡尔曼滤波调参实战:手把手教你调整Q和R,让Python小车轨迹预测更精准

卡尔曼滤波调参实战&#xff1a;手把手教你调整Q和R&#xff0c;让Python小车轨迹预测更精准在机器人定位和自动驾驶领域&#xff0c;卡尔曼滤波就像一位隐形的导航员&#xff0c;默默修正着传感器传来的嘈杂数据。但这位导航员的工作质量&#xff0c;很大程度上取决于我们为它…...

MO-OBAM模型参数调优实战:平衡数据匿名化中的隐私保护与信息损失

1. 项目概述与核心挑战数据匿名化&#xff0c;听起来像是个技术黑话&#xff0c;但说白了&#xff0c;就是给数据“戴上面具”。无论是金融信贷记录、人口普查信息还是敏感的医疗病历&#xff0c;在共享给第三方进行分析前&#xff0c;都必须经过这道工序&#xff0c;以防止张三…...

高能物理数据分析实战:从W玻色子截面测量到机器学习应用

1. 项目概述&#xff1a;从海量对撞数据到物理发现如果你对宇宙的构成充满好奇&#xff0c;想知道我们是如何发现希格斯玻色子&#xff0c;或者顶夸克的质量是如何被精确测量的&#xff0c;那么高能物理数据分析就是你正在寻找的钥匙。这听起来可能离日常生活很远&#xff0c;但…...

机器学习分子动力学揭秘镁腐蚀原子机制:从DFT到MLMD的跨尺度模拟实践

1. 项目概述与核心价值镁合金&#xff0c;作为最轻的工程结构金属&#xff0c;在航空航天、生物医疗和下一代储能技术&#xff08;如镁空气电池&#xff09;领域被寄予厚望。然而&#xff0c;一个长期困扰材料科学家和工程师的“阿喀琉斯之踵”是其在水性环境中过快的腐蚀速率。…...

符号回归在超快磁动力学研究中的应用:从数据中挖掘物理规律

1. 项目概述&#xff1a;当机器学习遇见超快磁动力学 在自旋电子学这个前沿领域&#xff0c;我们一直在与时间赛跑。从纳秒级的磁畴翻转&#xff0c;到飞秒级的超快退磁&#xff0c;理解磁性材料在不同时间尺度下的行为&#xff0c;是设计下一代高速、高密度存储器和逻辑器件的…...

FPGA加速机器学习在粒子物理触发系统中的应用与实战

1. 项目概述&#xff1a;当FPGA遇上机器学习&#xff0c;为粒子物理装上“火眼金睛” 在大型强子对撞机&#xff08;LHC&#xff09;的心脏地带&#xff0c;每秒发生着数亿次质子对撞。每一次对撞都可能产生希格斯玻色子、顶夸克&#xff0c;或是我们尚未知晓的新物理现象。然而…...

Lovable移动端体验跃迁指南(2024年iOS/Android双平台实测数据验证)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Lovable移动端体验跃迁的范式变革 移动体验正从“可用”迈向“可恋”——Lovable 不再是情感修辞&#xff0c;而是以用户心智留存为标尺的技术范式重构。它要求交互具备可预测性、反馈具备呼吸感、动效…...

8051单片机sbit与extern bit的L1警告解决方案

1. 问题背景与现象分析在8051单片机开发中&#xff0c;我们经常需要直接操作特殊功能寄存器&#xff08;SFR&#xff09;的位。比如用P1.4引脚作为片选信号线时&#xff0c;通常会这样定义&#xff1a;sbit CS P1^4;但当这个定义放在主程序文件&#xff0c;而其他模块文件通过…...

从电路振荡到种群竞争:常系数线性微分方程组在建模中的实战指南

从电路振荡到种群竞争&#xff1a;常系数线性微分方程组在建模中的实战指南微分方程是描述动态系统的数学语言&#xff0c;而常系数线性微分方程组则是其中最具工程实用价值的一类。不同于纯数学视角下的求解技巧&#xff0c;本文将带你穿越两个经典场景——电子工程中的RLC振荡…...