Java实现驼峰与下划线互转的方法
作者:princeAladdin
这篇文章主要为大家详细介绍了Java实现驼峰与下划线互转的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
1.使用 Guava 实现
先引入相关依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
1.1 驼峰转下划线
public static void main(String[] args) {
String resultStr = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "userName");
System.out.println("转换后结果是:"+resultStr);
}
转换后结果是:user_name
1.2 下划线转驼峰
public static void main(String[] args) {
String resultStr = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "user_name");
System.out.println("转换后结果是:"+resultStr);
}
转换后结果是:userName
2.自定义代码转
2.1驼峰转下划线
private static final Pattern TPATTERN = Pattern.compile("[A-Z0-9]");
private String teseDemo(String str) {
Matcher matcher = TPATTERN.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
2.2下划线转驼峰
private static final char UNICON = '_';
private String underlineToCamel(String param) {
if (StringUtils.isBlank(param)) {
return "";
}
int len = param.length();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++) {
char c = Character.toLowerCase(param.charAt(i));
if (c == UNICON) {
if (++i < len) {
sb.append(Character.toUpperCase(param.charAt(i)));
}
} else {
sb.append(c);
}
}
return sb.toString();
}2.3、另外两种方法
/**
* 下划线转驼峰
* @param str
* @return
*/
public static String lineToHump(String str) {
Pattern linePattern = Pattern.compile("_(\\w)");
str = str.toLowerCase();
Matcher matcher = linePattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}
/**
* 驼峰转下划线
* @param str
* @return
*/
public static String humpToLine(String str) {
Pattern humpPattern = Pattern.compile("[A-Z]");
Matcher matcher = humpPattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
2.4、工具类
public class Tool {
private static Pattern linePattern = Pattern.compile("_(\\w)");
/** 下划线转驼峰 */
public static String lineToHump(String str) {
str = str.toLowerCase();
Matcher matcher = linePattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}
/** 驼峰转下划线(简单写法,效率低于{@link #humpToLine2(String)}) */
public static String humpToLine(String str) {
return str.replaceAll("[A-Z]", "_$0").toLowerCase();
}
private static Pattern humpPattern = Pattern.compile("[A-Z]");
/** 驼峰转下划线,效率比上面高 */
public static String humpToLine2(String str) {
Matcher matcher = humpPattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
public static void main(String[] args) {
String lineToHump = lineToHump("f_parent_no_leader");
System.out.println(lineToHump);// fParentNoLeader
System.out.println(humpToLine(lineToHump));// f_parent_no_leader
System.out.println(humpToLine2(lineToHump));// f_parent_no_leader
}
}不纠结"“_”+matcher.group(0).toLowerCase()"的话,humpToLine2效率会比humpToLine高一些,看String#replaceAll方法源码即可。
实体类:
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = -329066647199569031L;
private String userName;
private String orderNo;
}
工具类
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
/**
* JSON的驼峰和下划线互转帮助类
*
*
*/
public class JsonUtils {
/**
* 将对象的大写转换为下划线加小写,例如:userName-->user_name
*
* @param object
* @return
* @throws JsonProcessingException
*/
public static String toUnderlineJSONString(Object object) throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
mapper.setSerializationInclusion(Include.NON_NULL);
String reqJson = mapper.writeValueAsString(object);
return reqJson;
}
/**
* 将下划线转换为驼峰的形式,例如:user_name-->userName
*
* @param json
* @param clazz
* @return
* @throws IOException
*/
public static <T> T toSnakeObject(String json, Class<T> clazz) throws IOException{
ObjectMapper mapper = new ObjectMapper(); // mapper的configure方法可以设置多种配置(例如:多字段 少字段的处理) //mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
T reqJson = mapper.readValue(json, clazz);
return reqJson;
}
}
3.测试
import java.io.IOException;
import org.junit.Test;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
public class JsonTest {
@Test
public void testToUnderlineJSONString(){
User user = new User("张三", "1111111");
try {
String json = JsonUtils.toUnderlineJSONString(user);
System.out.println(json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
@Test
public void testToSnakeObject(){
String json = "{\"user_name\":\"张三\",\"order_no\":\"1111111\"}";
try {
User user = JsonUtils.toSnakeObject(json, User.class);
System.out.println(JSONObject.toJSONString(user));
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试结果:
{"user_name":"张三","order_no":"1111111"}
{"orderNo":"1111111","userName":"张三"}
以上就是Java实现驼峰与下划线互转的方法的详细内容,更多关于Java驼峰与下划线互转的资料请关注脚本之家其它相关文章!
