实战小技巧5:驼峰与下划线互转

简介: 这个考题非常实用,特别是对于我们这些号称只需要CURD的后端开发来说,驼峰与下划线互转,这不是属于日常任务么;一般来讲db中的列名,要求是下划线格式(why? 阿里的数据库规范是这么定义的,就我感觉驼峰也没毛病),而java实体命名则是驼峰格式,所以它们之间的互转,就必然存在一个驼峰与下划线的互转今天我们就来看一下,这两个的互转支持方式

这个考题非常实用,特别是对于我们这些号称只需要CURD的后端开发来说,驼峰与下划线互转,这不是属于日常任务么;一般来讲db中的列名,要求是下划线格式(why? 阿里的数据库规范是这么定义的,就我感觉驼峰也没毛病),而java实体命名则是驼峰格式,所以它们之间的互转,就必然存在一个驼峰与下划线的互转


今天我们就来看一下,这两个的互转支持方式


1. Gauva



一般来讲遇到这种普适性的问题,大部分都是有现成的工具类可以来直接使用的;在java生态中,说到好用的工具百宝箱,guava可以说是排列靠前的


接下来我们看一下如何使用Gauva来实现我们的目的

// 驼峰转下划线
String ans = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "helloWorld");
System.out.println(ans);
// 下划线转驼峰
String ans2 = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "hello_world");
System.out.println(ans2);
复制代码


在这里主要使用的是CaseFormat来实现互转,guava的CaseFormat还提供了其他几种方式


上面这个虽然可以实现互转,但是如果我们有一个字符串为 helloWorld_Case

将其他转换输出结果如下:


  • 下划线:hello_world__case
  • 驼峰:helloworldCase


这种输出,和标准的驼峰/下划线不太一样了(当然原因是由于输入也不标准)


2. Hutool



除了上面的guava,hutool的使用也非常广,其中包含很多工具类,其StrUtil也提供了下划线与驼峰的互转支持


String ans = StrUtil.toCamelCase("hello_world");
System.out.println(ans);
String ans2 = StrUtil.toUnderlineCase("helloWorld");
System.out.println(ans2);
复制代码


同样的我们再来看一下特殊的case


System.out.println(StrUtil.toCamelCase("helloWorld_Case"));
System.out.println(StrUtil.toUnderlineCase("helloWorld_Case"));
复制代码


输出结果如下


  • 驼峰:helloworldCase
  • 下划线: hello_world_case


相比较上面的guava的场景,下划线这个貌似还行


3. 自定义实现



接下来为了满足我们希望转换为标砖的驼峰/下划线输出方式的需求,我们自己来手撸一个


下划线转驼峰:


  • 关键点就是找到下划线,然后去掉它,下一个字符转大写续上(如果下一个还是下划线,那继续找下一个)


根据上面这个思路来实现,如下


private static final char UNDER_LINE = '_';
/**
 * 下划线转驼峰
 *
 * @param name
 * @return
 */
public static String toCamelCase(String name) {
    if (null == name || name.length() == 0) {
        return null;
    }
    int length = name.length();
    StringBuilder sb = new StringBuilder(length);
    boolean underLineNextChar = false;
    for (int i = 0; i < length; ++i) {
        char c = name.charAt(i);
        if (c == UNDER_LINE) {
            underLineNextChar = true;
        } else if (underLineNextChar) {
            sb.append(Character.toUpperCase(c));
            underLineNextChar = false;
        } else {
            sb.append(c);
        }
    }
    return sb.toString();
}
复制代码


驼峰转下划线


  • 关键点:大写的,则前位补一个下划线,当前字符转小写(如果前面已经是一个下划线了,那前面不补,直接转小写即可)
public static String toUnderCase(String name) {
    if (name == null) {
        return null;
    }
    int len = name.length();
    StringBuilder res = new StringBuilder(len + 2);
    char pre = 0;
    for (int i = 0; i < len; i++) {
        char ch = name.charAt(i);
        if (Character.isUpperCase(ch)) {
            if (pre != UNDER_LINE) {
                res.append(UNDER_LINE);
            }
            res.append(Character.toLowerCase(ch));
        } else {
            res.append(ch);
        }
        pre = ch;
    }
    return res.toString();
}
复制代码


再次测试helloWorld_Case,输出如下


  • 驼峰:helloWorldCase
  • 下划线: hello_world_case



相关文章
|
6月前
|
存储 C语言
C语言小写字母转换大写字母
C语言小写字母转换大写字母
131 0
|
17天前
将小写字母全部转换成大写字母
【10月更文挑战第17天】将小写字母全部转换成大写字母。
38 5
|
1月前
|
C语言
C语言中大小写字母的转换
C语言中大小写字母的转换
90 0
|
6月前
|
弹性计算 运维 Shell
|
4月前
|
Java 程序员
驼峰命名法在编程中的应用
驼峰命名法在编程中的应用
|
5月前
|
程序员
|
6月前
|
C语言 数据安全/隐私保护 Python
C语言中大小写字母的转化
C语言中大小写字母的转化
91 0
|
C++
C++实现中文大写与阿拉伯数字的相互转换(类封装)
C++实现中文大写与阿拉伯数字的相互转换(类封装)
594 0
|
C语言 C++
信奥赛一本通1138:将字符串中的小写字母转换成大写字母
【题目描述】 给定一个字符串,将其中所有的小写字母转换成大写字母。 【输入】 输入一行,包含一个字符串(长度不超过100,可能包含空格)。 【输出】 输出转换后的字符串。 【输入样例】 helloworld123Ha 【输出样例】 HELLOWORLD123HA
461 0
|
Python
Python:case-convert命名规则转换和命名风格:驼峰、蛇形、帕斯卡
Python:case-convert命名规则转换和命名风格:驼峰、蛇形、帕斯卡
343 0
Python:case-convert命名规则转换和命名风格:驼峰、蛇形、帕斯卡