将连字符分隔的单词(例如"do-some-stuff")转换为Java中较低的camel-case变体(例如"doSomeStuff")的最优雅方法是什么?
Joa*_*uer 86
使用CaseFormat
从番石榴:
import static com.google.common.base.CaseFormat.*;
String result = LOWER_HYPHEN.to(LOWER_CAMEL, "do-some-stuff");
Run Code Online (Sandbox Code Playgroud)
ear*_*cam 14
使用Java 8,终于有了一个单行:
Arrays.stream(name.split("\\-"))
.map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1).toLowerCase())
.collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)
虽然它需要分成4条实际线条才能清晰可辨
(注意:"\\-"
对于kebab-case按照问题,对于snake_case只需更改为"_"
)
以下方法应该在O(n)中非常有效地处理任务.我们只是迭代xml方法名称的字符,跳过任何' - '并在需要时大写字符.
public static String toJavaMethodName(String xmlmethodName) {
StringBuilder nameBuilder = new StringBuilder(xmlmethodName.length());
boolean capitalizeNextChar = false;
for (char c:xmlMethodName.toCharArray()) {
if (c == '-') {
capitalizeNextChar = true;
continue;
}
if (capitalizeNextChar) {
nameBuilder.append(Character.toUpperCase(c));
} else {
nameBuilder.append(c);
}
capitalizeNextChar = false;
}
return nameBuilder.toString();
}
Run Code Online (Sandbox Code Playgroud)
为什么不试试这个:
编辑:第二个想法...在尝试实现这一点时,我发现没有简单的方法来加入Java中的字符串列表.除非你使用StringUtil
apache.所以你需要创建一个StringBuilder
反正因此算法会变得有点难看:(
代码:以下是上述方法的示例.有人使用Java编译器(抱歉,没有一个方便)可以测试吗?并将其与此处的其他版本进行基准测试?
public static String toJavaMethodNameWithSplits(String xmlMethodName)
{
String[] words = xmlMethodName.split("-"); // split on "-"
StringBuilder nameBuilder = new StringBuilder(xmlMethodName.length());
nameBuilder.append(words[0]);
for (int i = 1; i < words.length; i++) // skip first
{
nameBuilder.append(words[i].substring(0, 1).toUpperCase());
nameBuilder.append(words[i].substring(1));
}
return nameBuilder.toString(); // join
}
Run Code Online (Sandbox Code Playgroud)
如果您不喜欢依赖库,可以使用正则表达式和String.format
.使用正则表达式提取后的起始字符-
.使用这些作为输入String.format
.有点棘手,但没有(explizit)循环工作;).
public class Test {
public static void main(String[] args) {
System.out.println(convert("do-some-stuff"));
}
private static String convert(String input) {
return String.format(input.replaceAll("\\-(.)", "%S"), input.replaceAll("[^-]*-(.)[^-]*", "$1-").split("-"));
}
}
Run Code Online (Sandbox Code Playgroud)
对于项目中有 com.fasterxml.jackson 库并且不想添加 guava 的人,可以使用 jasksonnamingStrategy 方法:
new PropertyNamingStrategy.SnakeCaseStrategy.translate(String);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19571 次 |
最近记录: |