驼峰式与下划线式命名相互转换

发布时间 2023-03-26 17:13:17作者: 达叔叔

1、下划线命名转换为驼峰式命名

    /**
     * 将连接符方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
     *
     * @param name   转换前的自定义方式命名的字符串
     * @param symbol 连接符
     * @return 转换后的驼峰式命名的字符串
     */
    public static String toCamelCase(String name, char symbol) {
        if (null == name) {
            return null;
        }

        if (name.indexOf(symbol) >= 0) {
            final int length = name.length();
            final StringBuilder sb = new StringBuilder(length);
            boolean upperCase = false;
            for (int i = 0; i < length; i++) {
                char c = name.charAt(i);

                if (c == symbol) {
                    upperCase = true;
                } else if (upperCase) {
                    sb.append(Character.toUpperCase(c));
                    upperCase = false;
                } else {
                    sb.append(Character.toLowerCase(c));
                }
            }
            return sb.toString();
        } else {
            return name;
        }
    }

 

2、驼峰式转下划线式的命名

    /**
     * 将连接符方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
     *
     * @param name   转换前的自定义方式命名的字符串
     * @param symbol 连接符
     * @return 转换后的驼峰式命名的字符串
     */
    public static String toUnderlineCase(String name, char symbol) {
        if (name == null) {
            return null;
        }

        final int length = name.length();
        final StringBuilder sb = new StringBuilder();
        char c;
        for (int i = 0; i < length; i++) {
            c = name.charAt(i);
            if (Character.isUpperCase(c)) {
                final Character preChar = (i > 0) ? name.charAt(i - 1) : null;
                final Character nextChar = (i < name.length() - 1) ? name.charAt(i + 1) : null;

                if (null != preChar) {
                    if (symbol == preChar) {
                        // 前一个为分隔符
                        if (null == nextChar || Character.isLowerCase(nextChar)) {
                            //普通首字母大写,如_Abb -> _abb
                            c = Character.toLowerCase(c);
                        }
                        //后一个为大写,按照专有名词对待,如_AB -> _AB
                    } else if (Character.isLowerCase(preChar)) {
                        // 前一个为小写
                        sb.append(symbol);
                        if (null == nextChar || Character.isLowerCase(nextChar) || Character.isDigit(nextChar)) {
                            //普通首字母大写,如aBcc -> a_bcc
                            c = Character.toLowerCase(c);
                        }
                        // 后一个为大写,按照专有名词对待,如aBC -> a_BC
                    } else {
                        //前一个为大写
                        if (null == nextChar || Character.isLowerCase(nextChar)) {
                            // 普通首字母大写,如ABcc -> A_bcc
                            sb.append(symbol);
                            c = Character.toLowerCase(c);
                        }
                        // 后一个为大写,按照专有名词对待,如ABC -> ABC
                    }
                } else {
                    // 首字母,需要根据后一个判断是否转为小写
                    if (null == nextChar || Character.isLowerCase(nextChar)) {
                        // 普通首字母大写,如Abc -> abc
                        c = Character.toLowerCase(c);
                    }
                    // 后一个为大写,按照专有名词对待,如ABC -> ABC
                }
            }
            sb.append(c);
        }
        return sb.toString();
    }

在工作中,需要将键值进行转换。