Code Style之间相互转化工具
支持的Code Style
- 小驼峰(camelCase):首字母小写,分隔部分大写,其余全小写
- 大驼峰(PascalCase):首字母大写,分隔部分大写,其余全小写
- 小下划线(snake_case): 全小写,分隔部分用 _ 标记
- 大下划线(SCREAMING_SNAKE_CASE:) 全大写,分隔部分用 _ 标记
- 中下划线(kebab-case): 全小写,分隔部分用 - 标记
代码
public enum CaseMode {
SNAKE {
@Override
protected boolean isSplitMarker(Character lastChar, Character currentChar) {
return lastChar != null && lastChar.equals('_') && Character.isLetter(currentChar);
}
@Override
protected boolean needRemove(Character lastChar, Character currentChar) {
return currentChar.equals('_');
}
@Override
public String toSnakeCase(String original) {
return original;
}
},
CAMEL {
@Override
protected boolean isSplitMarker(Character lastChar, Character currentChar) {
return lastChar != null && Character.isLowerCase(lastChar) && Character.isUpperCase(currentChar);
}
@Override
protected boolean needRemove(Character lastChar, Character currentChar) {
return false;
}
@Override
public String toCamelCase(String original) {
return original;
}
},
KEBAB {
@Override
protected boolean isSplitMarker(Character lastChar, Character currentChar) {
return lastChar != null && lastChar.equals('-') && Character.isLetter(currentChar);
}
@Override
protected boolean needRemove(Character lastChar, Character currentChar) {
return currentChar.equals('-');
}
@Override
public String toKebabCase(String original) {
return original;
}
},
PASCAL {
@Override
protected boolean isSplitMarker(Character lastChar, Character currentChar) {
return lastChar != null && Character.isLowerCase(lastChar) && Character.isUpperCase(currentChar);
}
@Override
protected boolean needRemove(Character lastChar, Character currentChar) {
return false;
}
@Override
public String toPascalCase(String original) {
return original;
}
},
SCREAMING_SNAKE {
@Override
protected boolean isSplitMarker(Character lastChar, Character currentChar) {
return lastChar != null && lastChar.equals('_') && Character.isLetter(currentChar);
}
@Override
protected boolean needRemove(Character lastChar, Character currentChar) {
return currentChar.equals('_');
}
@Override
public String toScreamingSnakeCase(String original) {
return original;
}
};
protected String styleCase(String original, TransferFunction transferFunction) {
StringBuilder ret = new StringBuilder(original.length());
char[] chars = original.toCharArray();
Character lastChar = null;
for (char currentChar : chars) {
boolean needRemove = needRemove(lastChar, currentChar);
if (!needRemove) {
boolean splitMarker = isSplitMarker(lastChar, currentChar);
ret.append(transferFunction.transfer(splitMarker, lastChar, currentChar));
}
lastChar = currentChar;
}
return ret.toString();
}
public String toSnakeCase(String original) {
return styleCase(original, this::transfer2SnakeCase);
}
public String toCamelCase(String original) {
return styleCase(original, this::transfer2CamelCase);
}
public String toKebabCase(String original) {
return styleCase(original, this::transfer2KebabCase);
}
public String toPascalCase(String original) {
return styleCase(original, this::transfer2PascalCase);
}
public String toScreamingSnakeCase(String original) {
return styleCase(original, this::transferScreamingSnakeCase);
}
protected String transfer2SnakeCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
String ret = "";
if (isSplitMarker) {
ret += ("_" + currentChar);
} else {
ret += Character.toLowerCase(currentChar);
}
return ret;
}
protected String transfer2CamelCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
String ret = "";
if (lastChar == null) {
ret += Character.toLowerCase(currentChar);
} else if (isSplitMarker) {
ret += Character.toUpperCase(currentChar);
} else {
ret += Character.toLowerCase(currentChar);
}
return ret;
}
protected String transfer2KebabCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
String ret = "";
if (isSplitMarker) {
ret += ("-" + currentChar);
} else {
ret += Character.toLowerCase(currentChar);
}
return ret;
}
protected String transfer2PascalCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
String ret = "";
if (lastChar == null) {
ret += Character.toUpperCase(currentChar);
} else if (isSplitMarker) {
ret += Character.toUpperCase(currentChar);
} else {
ret += Character.toLowerCase(currentChar);
}
return ret;
}
protected String transferScreamingSnakeCase(boolean isSplitMarker, Character lastChar, Character currentChar) {
String ret = "";
if (isSplitMarker) {
ret += ("_" + currentChar);
} else {
ret += Character.toUpperCase(currentChar);
}
return ret;
}
protected abstract boolean isSplitMarker(Character lastChar, Character currentChar);
protected abstract boolean needRemove(Character lastChar, Character currentChar);
private interface TransferFunction {
String transfer(boolean isSplitMarker, Character lastChar, Character currentChar);
}
public static String convert(String fromString, CaseMode fromMode, CaseMode toMode) {
String ret = "";
switch (toMode) {
case CAMEL:
ret = fromMode.toCamelCase(fromString);
break;
case KEBAB:
ret = fromMode.toKebabCase(fromString);
break;
case PASCAL:
ret = fromMode.toPascalCase(fromString);
break;
case SNAKE:
ret = fromMode.toSnakeCase(fromString);
break;
case SCREAMING_SNAKE:
ret = fromMode.toScreamingSnakeCase(fromString);
break;
}
return ret;
}
}
复制代码
使用方式
@Test
void snake2CamelTest() {
Assertions.assertThat(CaseMode.SNAKE.toCamelCase("qweee_qweqwe")).isEqualTo("qweeeQweqwe");
}
CaseMode.convert(originCaseStr, fromMode, toMode);
复制代码