将连字符分隔的单词(例如"do-some-stuff")转换为较低的驼峰式变体(例如"doSomeStuff")的最优雅方法是什么?

Chr*_*wes 46 java

将连字符分隔的单词(例如"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只需更改为"_")


And*_*s_D 9

以下方法应该在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)


Dar*_*mas 8

为什么不试试这个:

  1. 拆分为" - "
  2. 大写每个单词,跳过第一个单词
  3. 加入

编辑:第二个想法...在尝试实现这一点时,我发现没有简单的方法来加入Java中的字符串列表.除非你使用StringUtilapache.所以你需要创建一个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)


Arn*_*sch 6

如果您不喜欢依赖库,可以使用正则表达式和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)


Chi*_*Dov 5

对于项目中有 com.fasterxml.jackson 库并且不想添加 guava 的人,可以使用 jasksonnamingStrategy 方法:

new PropertyNamingStrategy.SnakeCaseStrategy.translate(String);
Run Code Online (Sandbox Code Playgroud)