编码技巧:多条件判断拼接字符串
在写代码业务逻辑的时候,有时候需求稍微变化一下都让代码变的很麻烦,如果只在现有代码基础上硬改,可能会让可读性降低,本文通过一个例子来演示字符串拼接的变化。
一开始的业务逻辑比较简单,是固定条件加一个需要判断再追加的条件:
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 "才会出现。
按照上面的方案,不仅方便我们增加更多的类似条件,而且可读性也大大提高了,遇到类似变化的时候,不能只实现功能,还要考虑易读性和后续可能的变化。
相关文章:
编码技巧:多条件判断拼接字符串
在写代码业务逻辑的时候,有时候需求稍微变化一下都让代码变的很麻烦,如果只在现有代码基础上硬改,可能会让可读性降低,本文通过一个例子来演示字符串拼接的变化。 一开始的业务逻辑比较简单,是固定条件加一个需要判断…...
气压计LPS25HB开发(1)----轮询获取气压计数据
气压计LPS25HB开发----1.轮询获取气压计数据 概述视频教学样品申请源码下载产品特性通信模式速率生成STM32CUBEMX串口配置IIC配置SA0地址设置串口重定向参考程序SA0设置模块地址获取ID复位操作BDU设置设置速率轮询读取数据演示 概述 本文将介绍如何使用 LPS25HB 传感器来读取数…...
这个不需要吗 HttpServletRequest req
这个不需要吗 HttpServletRequest req 在这个特定场景下,您在OnlineStudentFeignService接口中确实不需要直接使用HttpServletRequest对象。因为Feign是一个声明式的HTTP客户端,它的设计目标是简化服务间的远程调用,它并不直接处理原始的HTT…...
【算法与数据结构】深入解析二叉树(一)
文章目录 📝数概念及结构🌠 树的概念🌉树的表示🌠 树在实际中的运用(表示文件系统的目录树结构) 🌉二叉树概念及结构🌠概念🌉数据结构中的二叉树🌠特殊的二叉…...
深入浅出:Objective-C中使用MWFeedParser下载豆瓣RSS
摘要 本文旨在介绍如何在Objective-C中使用MWFeedParser库下载豆瓣RSS内容,同时展示如何通过爬虫代理IP技术和多线程提高爬虫的效率和安全性。 背景 随着信息量的激增,爬虫技术成为了获取和处理大量网络数据的重要手段。Objective-C作为一种成熟的编程…...
Java日志框架Log4j 2详解
有时希望能够以文件的形式记录执行过程中出现的异常信息,甚至记录程序正常运行的关键步骤,以便日后查看,那么该如何处理呢? 答:显然,可以自行编程实现这个需求,但是,从更注重效率和性能的方面考虑&#x…...
【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型
摘要 本次剪枝实战是基于下面这篇论文去复现的,主要是实现对BN层的γ/gamma进行剪枝操作,本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文:Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…...
OSI(Open Systems Interconnection)模型和TCP/IP模型
OSI模型 OSI模型是一个概念模型,由国际标准化组织(ISO)在1984年提出,用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层,每一层都有其特定的功能,从下至上依次是: 物理层&#x…...
git基础命令(二)
目录 git revert 撤消上一次提交的更改但是会创建一个新的提交来撤消该提交所做的更改git show 显示提交详细信息git mv 重命名文件git rm 从工作树和索引中移除文件git clean 从工作树中移除未跟踪文件git checkout 将文件恢复到工作树git reset 撤销更改、移动 HEAD 指针以及…...
从零开始学习typescript系列 1:typescript 基本了解之是什么,为什么,以及怎么用
初识ts 基本了解 设计者,实现者:微软发行时间:2012年10月1日GitHub:https://github.com/microsoft/TypeScriptts和js关系:ts是js的扩展,ts语法包含js ts是新语言吗? 不是,在js基…...
【数学建模】线性规划
针对未来可能的数学建模比赛内容,我对学习的内容做了一些调整,所以先跳过灰色关联分析和模糊综合评价的代码,今天先来了解一下运筹规划类——线性规划模型。 背景: 某数学建模游戏有三种题型,分别是A,B&am…...
MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2
MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,在物联网和消息传递系统中广泛应用。MQTT 提供了三个不同的 QoS(Quality of Service)等级,用于确保消息的可靠性和传输效率。本文将详细…...
搭建个人智能家居 3 -第一个设备“点灯”
搭建个人智能家居 3 -第一个外设“点灯” 前言ESPHome点灯 HomeAssistant 前言 前面我们已经完成了搭建这个智能家居所需要的环境HomeAssistant和ESPHome,今天我们开始在这个智能家居中添加我们的第一个设备(一颗LED灯),如果环境…...
基于 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,为了不与系统上的其它进程监听端口冲突,我们在启动…...
(delphi11最新学习资料) Object Pascal 学习笔记---第7章第1节(创建对象 )
7.1.4 创建对象 与其他流行的编程语言比较之后,让我们回到 Pascal,看看如何使用类。 一旦定义了类,我们就可以创建一个该类型的对象,代码片段如下(本节所有代码提取自 Dates1 示例)那样:…...
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:自动化处理PDF文档集合,提取文献标题、合并文献PDF并生成目录和页码 引言:功能概述步骤一:提取PDF标题步骤二:生成目录和页码,合并PDF技术亮点 代码步骤一:提取PDF标题(Step_…...
vue 基于elementUI/antd-vue, h函数实现message中嵌套链接跳转到指定路由 (h函数点击事件的写法)
效果如图: 点击message 组件中的 工单管理, 跳转到工单管理页面。 以下是基于vue3 antd-vue 代码如下: import { message } from ant-design-vue; import { h, reactive, ref, watch } from vue; import { useRouter } from vue-router; c…...
数字排列 - 华为OD统一考试(C卷)
OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 小明负责公司年会,想出一个趣味游戏: 屏幕给出 1−9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 n 位置…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
