如何优雅的去掉空格和引号,带一个优雅的封装(jdk8通用)
一、java后端开发为什么要主动去掉空格
在Java后端开发中,通常会主动去掉字符串中的空格,这主要基于以下几个原因:
-
数据处理:==去掉空格可以确保数据的准确性和一致性==。在处理用户输入、表单提交或数据库查询等操作时,去掉空格可以防止不必要的错误和意外情况。例如,如果用户在输入时不小心在字符串的开头或结尾添加了空格,去掉空格可以确保输入的数据符合预期。
-
数据存储:在某些情况下,==存储空格可能会占用不必要的存储空间==。例如,如果你在数据库中存储用户名或标识符等字段,去掉空格可以减少存储空间的使用,并提高数据库性能。
-
数据比较:==去掉空格可以帮助进行字符串的比较==。在某些情况下,字符串的比较可能需要忽略空格,以确保正确的匹配。通过去掉空格,可以在比较之前规范化字符串,使得比较更加准确和可靠。
-
输入验证:在验证用户输入时,==去掉空格可以提高验证的准确性==。例如,如果用户在输入时添加了额外的空格,去掉空格可以帮助你正确识别和处理输入数据。这对于密码验证、表单验证和数据校验等场景非常有用。
需要注意的是,空格的处理通常取决于具体的业务需求和上下文。在某些情况下,保留空格可能是必要的,例如处理文本内容或保留用户输入的原始格式。因此,在处理空格时,要仔细考虑业务需求并权衡利弊。
二、java一般怎么去掉前后空格
在Java中,可以使用以下方法去掉字符串的前后空格:
- 使用 trim() 方法:trim() 方法是 String 类提供的一个内置方法,用于去掉字符串的前后空格。它返回一个新的字符串,该字符串是去掉前后空格后的结果。
String str = " Hello, World! ";
String trimmedStr = str.trim();
System.out.println(trimmedStr); // 输出: "Hello, World!"
- 使用正则表达式:如果你需要更复杂的空格处理,例如除了空格之外还要去掉其他空白字符(如制表符、换行符等),可以使用正则表达式。
import java.util.regex.Pattern;
String str = " Hello, World! ";
String trimmedStr = str.replaceAll("^\\s+|\\s+$", "");
System.out.println(trimmedStr); // 输出: "Hello, World!"
三、这些都有什么坏处
1、假如一个接口有10个String变量,那么要写10次trim()或者使用10次正则;这是相当不优雅的。
2、万一头昏脑晕的写漏了,搞出一个bug,也是相当尴尬的(作者曾经就有一个没有处理,最后被整个软件部门当了反例,那场面,至今不能释怀)
3、不便于维护,原因就有上面两点,维护起来难受死。
四、怎么去优化它呢?
优化的方法可能有很多,我是这么思考的,现在一般的风格都是使用对象接收前端传过来的参数,我们最终会把这些参数组装成一个对象。
我的办法就是在这个对象这里搞事情。
1、我定义一个切面,这个切面对Controller发起处理
2、切面调用我自己封装的字符串空格处理工具类
3、处理完成之后放行
sequenceDiagram
participant 对象
participant 切面
participant controller
participant 工具类
对象->>controller: 封装的对象流向controller
切面->>controller: 拦截对象
切面->>工具类: 调用工具类处理对象里面的字符串
切面->>controller: 处理完对象后放行
五、基于JDK8封装的工具类
5.1 工具类
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 去掉字符串类型的首尾空格、引号工具类
*
* @author bamboo panda
* @version 1.0
* @date 2023/9/16 22:12
*/
public class BeanValueTrimUtil {
/**
* 去掉bean中所有属性为字符串的《前后空格》
*
* @param bean
* @throws Exception
*/
public static void beanValueTrim(Object bean) throws Exception {
if (bean != null) {
//获取所有的字段包括public,private,protected,private
Field[] fields = bean.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
if (f.getType().getName().equals("java.lang.String")) {
//获取字段名
String key = f.getName();
Object value = getFieldValue(bean, key);
if (null == value) {
continue;
}
setFieldValue(bean, key, value.toString().trim());
}
}
}
}
/**
* 去掉bean中所有属性为字符串的《前后空格和前后引号》(包括单引号和双引号)
*
* @param bean
* @throws Exception
*/
public static void beanValueTrimAndQuotationMarks(Object bean) throws Exception {
if (bean != null) {
//获取所有的字段包括public,private,protected,private
Field[] fields = bean.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
if (f.getType().getName().equals("java.lang.String")) {
//获取字段名
String key = f.getName();
Object value = getFieldValue(bean, key);
if (null == value) {
continue;
}
setFieldValue(bean, key, quotationMarks(value.toString().trim()));
}
}
}
}
/**
* 去掉bean中所有属性为字符串的《所有空格和前后引号》(包括单引号和双引号)
*
* @param bean
* @throws Exception
*/
public static void beanValueSpaceAndQuotationMarks(Object bean) throws Exception {
if (bean != null) {
//获取所有的字段包括public,private,protected,private
Field[] fields = bean.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
if (f.getType().getName().equals("java.lang.String")) {
//获取字段名
String key = f.getName();
Object value = getFieldValue(bean, key);
if (null == value) {
continue;
}
setFieldValue(bean, key, quotationMarks(value.toString().replaceAll(" ", "")));
}
}
}
}
/**
* 去掉《前后引号》(包括单引号和双引号)
*
* @param param 需要处理的字符串
* @return
*/
public static String quotationMarks(String param) {
boolean[] flag = {false, false};
if (param.startsWith("\"")) {
param = param.substring(1, param.length());
} else if (param.startsWith("\'")) {
param = param.substring(1, param.length());
} else {
flag[0] = true;
}
if (param.endsWith("\"")) {
param = param.substring(0, param.length() - 1);
} else if (param.endsWith("\'")) {
param = param.substring(0, param.length() - 1);
} else {
flag[1] = true;
}
if (flag[0] && flag[1]) {
return param;
}
return quotationMarks(param);
}
/**
* 利用反射通过get方法获取bean中字段fieldName的值
*
* @param bean
* @param fieldName
* @return
* @throws Exception
*/
private static Object getFieldValue(Object bean, String fieldName)
throws Exception {
StringBuffer result = new StringBuffer();
String methodName = result.append("get")
.append(fieldName.substring(0, 1).toUpperCase())
.append(fieldName.substring(1)).toString();
Object rObject = null;
Method method = null;
@SuppressWarnings("rawtypes")
Class[] classArr = new Class[0];
method = bean.getClass().getMethod(methodName, classArr);
rObject = method.invoke(bean, new Object[0]);
return rObject;
}
/**
* 利用发射调用bean.set方法将value设置到字段
*
* @param bean
* @param fieldName
* @param value
* @throws Exception
*/
private static void setFieldValue(Object bean, String fieldName, Object value)
throws Exception {
StringBuffer result = new StringBuffer();
String methodName = result.append("set")
.append(fieldName.substring(0, 1).toUpperCase())
.append(fieldName.substring(1)).toString();
/**
* 利用发射调用bean.set方法将value设置到字段
*/
Class[] classArr = new Class[1];
classArr[0] = "java.lang.String".getClass();
Method method = bean.getClass().getMethod(methodName, classArr);
method.invoke(bean, value);
}
}
5.2 测试方法
/**
* 测试一下
*
* @author bamboo panda
* @version 1.0
* @date 2023/9/16 22:14
*/
public class Test {
public static class User {
private String username;
private String password;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public static void main(String[] args) throws Exception {
User user = new User();
user.setUsername(" \"\"'' h e\"'\"' h e''\"\" ");
user.setPassword(null);
user.setAge(12);
// BeanValueTrimUtil.beanValueTrim(user);
BeanValueTrimUtil.beanValueSpaceAndQuotationMarks(user);
System.out.println("=====" + user.getUsername() + "=====");
System.out.println(user.getPassword());
System.out.println(user.getAge());
}
}
最后,总结一下;写代码还是要多多思考,千万别被反例了