如何优雅的去掉空格和引号,带一个优雅的封装(jdk8通用)

818 阅读4分钟

如何优雅的去掉空格和引号,带一个优雅的封装(jdk8通用)

一、java后端开发为什么要主动去掉空格

在Java后端开发中,通常会主动去掉字符串中的空格,这主要基于以下几个原因:

  1. 数据处理:==去掉空格可以确保数据的准确性和一致性==。在处理用户输入、表单提交或数据库查询等操作时,去掉空格可以防止不必要的错误和意外情况。例如,如果用户在输入时不小心在字符串的开头或结尾添加了空格,去掉空格可以确保输入的数据符合预期。

  2. 数据存储:在某些情况下,==存储空格可能会占用不必要的存储空间==。例如,如果你在数据库中存储用户名或标识符等字段,去掉空格可以减少存储空间的使用,并提高数据库性能。

  3. 数据比较:==去掉空格可以帮助进行字符串的比较==。在某些情况下,字符串的比较可能需要忽略空格,以确保正确的匹配。通过去掉空格,可以在比较之前规范化字符串,使得比较更加准确和可靠。

  4. 输入验证:在验证用户输入时,==去掉空格可以提高验证的准确性==。例如,如果用户在输入时添加了额外的空格,去掉空格可以帮助你正确识别和处理输入数据。这对于密码验证、表单验证和数据校验等场景非常有用。

需要注意的是,空格的处理通常取决于具体的业务需求和上下文。在某些情况下,保留空格可能是必要的,例如处理文本内容或保留用户输入的原始格式。因此,在处理空格时,要仔细考虑业务需求并权衡利弊。

二、java一般怎么去掉前后空格

在Java中,可以使用以下方法去掉字符串的前后空格:

  1. 使用 trim() 方法:trim() 方法是 String 类提供的一个内置方法,用于去掉字符串的前后空格。它返回一个新的字符串,该字符串是去掉前后空格后的结果。
String str = "  Hello, World!  ";
String trimmedStr = str.trim();
System.out.println(trimmedStr); // 输出: "Hello, World!"
  1. 使用正则表达式:如果你需要更复杂的空格处理,例如除了空格之外还要去掉其他空白字符(如制表符、换行符等),可以使用正则表达式。
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());
    }
}

最后,总结一下;写代码还是要多多思考,千万别被反例了