代码之家  ›  专栏  ›  技术社区  ›  Christopher Klewes

将连字符分隔的单词(例如“do some stuff”)转换成小写的驼色变体(例如“dosomesuff”)最优雅的方法是什么?

  •  44
  • Christopher Klewes  · 技术社区  · 14 年前

    在Java中,将连字符分隔的单词(例如“do some stuff”)转换成小写的驼峰变体(例如“dosomesuff”)最优雅的方法是什么?

    10 回复  |  直到 7 年前
        1
  •  95
  •   Joachim Sauer    14 年前

    CaseFormat Guava

    import static com.google.common.base.CaseFormat.*;
    
    String result = LOWER_HYPHEN.to(LOWER_CAMEL, "do-some-stuff");
    
        2
  •  18
  •   earcam    5 年前

    使用Java 8 终于有一个 一个班轮 :

    Arrays.stream(name.split("\\-"))
        .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1).toLowerCase())
        .collect(Collectors.joining());
    

    实际的 线条清晰

    (注: "\\-" "_" )

        3
  •  9
  •   Andreas Dolk    14 年前

    下面的方法应该在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();
    }
    
        4
  •  8
  •   Daren Thomas    14 年前

    1. 在“-”上拆分

    编辑 StringUtil 来自阿帕奇。所以你需要创建一个 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
    }
    
        5
  •  6
  •   Arne Deutsch    14 年前

    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("-"));
        }
    
    }
    
        6
  •  4
  •   Community Ian Goodfellow    7 年前

    Andreas' answer 这比OP要求的要多:

    public static String toJavaMethodName(final String nonJavaMethodName){
        final StringBuilder nameBuilder = new StringBuilder();
        boolean capitalizeNextChar = false;
        boolean first = true;
    
        for(int i = 0; i < nonJavaMethodName.length(); i++){
            final char c = nonJavaMethodName.charAt(i);
            if(!Character.isLetterOrDigit(c)){
                if(!first){
                    capitalizeNextChar = true;
                }
            } else{
                nameBuilder.append(capitalizeNextChar
                    ? Character.toUpperCase(c)
                    : Character.toLowerCase(c));
                capitalizeNextChar = false;
                first = false;
            }
        }
        return nameBuilder.toString();
    }
    

    它处理一些特殊情况:

    • fUnnY-cASe 已转换为 funnyCase
    • --dash-before-and--after- 已转换为 dashBeforeAndAfter
    • some.other$funky:chars? 已转换为 someOtherFunkyChars
        7
  •  4
  •   Chi Dov    6 年前

    对于那些com.fasterxml.jackson公司项目中的库并且不想添加番石榴,可以使用jaskson-namingStrategy方法:

    new PropertyNamingStrategy.SnakeCaseStrategy.translate(String);
    
        8
  •  2
  •   Sean    14 年前

    获取用于StringUtils的apachecommons jar。然后你可以用大写法

    import org.apache.commons.lang.StringUtils;
    public class MyClass{
    
        public String myMethod(String str) {
            StringBuffer buff = new StringBuffer();
    
            String[] tokens = str.split("-");
            for (String i : tokens) {
                buff.append(StringUtils.capitalize(i));
            }
    
            return buff.toString();
        }
    }
    
        9
  •  2
  •   pdem    8 年前

    因为我不太喜欢只为一个方法添加库,所以我实现了自己的解决方案(从camel case到snake case):

    public String toSnakeCase(String name) {
        StringBuilder buffer = new StringBuilder();
        for(int i = 0; i < name.length(); i++) {
            if(Character.isUpperCase(name.charAt(i))) {
                if(i > 0) {
                    buffer.append('_');
                }
                buffer.append(Character.toLowerCase(name.charAt(i)));
            } else {
                buffer.append(name.charAt(i));
            }
        }
        return buffer.toString();
    }
    

    需要根据输入/输出情况进行调整。

        10
  •  0
  •   grellenort    4 年前

    在使用Spring框架的情况下,可以使用提供的StringUtils。

    import org.springframework.util.StringUtils;
    
    import java.util.Arrays;
    import java.util.stream.Collectors;
    
    public class NormalizeUtils {
    
        private static final String DELIMITER = "_";    
    
        private NormalizeUtils() {
            throw new IllegalStateException("Do not init.");
        }
    
        /**
         * Take name like SOME_SNAKE_ALL and convert it to someSnakeAll
         */
        public static String fromSnakeToCamel(final String name) {
            if (StringUtils.isEmpty(name)) {
                return "";
            }
    
            final String allCapitalized = Arrays.stream(name.split(DELIMITER))
                    .filter(c -> !StringUtils.isEmpty(c))
                    .map(StringUtils::capitalize)
                    .collect(Collectors.joining());
    
            return StringUtils.uncapitalize(allCapitalized);
        }
    }
    
        11
  •  -1
  •   Noel M    14 年前