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

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

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

每天一个实战小技巧:驼峰与下划线划转

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

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

1. Gauva

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

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

1
2
3
4
5
6
7
java复制代码// 驼峰转下划线
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
java复制代码String ans = StrUtil.toCamelCase("hello_world");
System.out.println(ans);
String ans2 = StrUtil.toUnderlineCase("helloWorld");
System.out.println(ans2);

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

1
2
java复制代码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
java复制代码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
java复制代码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. 一灰灰Blogliuyueyi.github.io/hexblog

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

2. 声明

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

  • 微博地址: 小灰灰Blog
  • QQ: 一灰灰/3302797840
  • 微信公众号: 一灰灰blog

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%