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

文章目录
  1. 1. Gauva
  2. 2. Hutool
  3. 3. 自定义实现
  • II. 其他
    1. 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
    2. 2. 声明
    3. 3. 扫描关注
  • 每天一个实战小技巧:驼峰与下划线划转

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

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

    1. Gauva

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

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

    1
    2
    3
    4
    5
    6
    7
    // 驼峰转下划线
    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也提供了下划线与驼峰的互转支持

    1
    2
    3
    4
    String ans = StrUtil.toCamelCase("hello_world");
    System.out.println(ans);
    String ans2 = StrUtil.toUnderlineCase("helloWorld");
    System.out.println(ans2);

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

    1
    2
    System.out.println(StrUtil.toCamelCase("helloWorld_Case"));
    System.out.println(StrUtil.toUnderlineCase("helloWorld_Case"));

    输出结果如下

    • 驼峰:helloworldCase
    • 下划线: hello_world_case

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

    3. 自定义实现

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

    下划线转驼峰:

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    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();
    }

    驼峰转下划线

    • 关键点:大写的,则前位补一个下划线,当前字符转小写(如果前面已经是一个下划线了,那前面不补,直接转小写即可)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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

    系列博文

    II. 其他

    1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

    一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

    2. 声明

    尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

    3. 扫描关注

    一灰灰blog

    QrCode

    评论

    Your browser is out-of-date!

    Update your browser to view this website correctly. Update my browser now

    ×