Подтвердить что ты не робот

Каков самый элегантный способ конвертировать дефисное слово (например, "делать что-то" ) в более низкое значение верблюжьего случая (например, "doSomeStuff" )?

Каков самый элегантный способ преобразования разделенного дефиса слова (например, "do-some-stuff" ) в более низкое изменение верблюжьего случая (например, "doSomeStuff" ) в Java?

4b9b3361

Ответ 1

Используйте CaseFormat из Guava:

import static com.google.common.base.CaseFormat.*;

String result = LOWER_HYPHEN.to(LOWER_CAMEL, "do-some-stuff");

Ответ 2

В Java 8 наконец-то есть одна строка:

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

Несмотря на то, что для разборчивости требуется разделение на 3 фактические строки ツ

(Примечание: "\\-" для случая с шашлыком согласно вопросу, для snake_case просто измените на "_")

Ответ 3

Следующий метод должен эффективно обрабатывать задачу в 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

Почему бы не попробовать это:

  • split on "-"
  • в верхнем регистре каждого слова, пропустив первый
  • присоединиться к

РЕДАКТИРОВАТЬ: во вторых соображениях... При попытке реализовать это я обнаружил, что нет простого способа присоединиться к списку строк в Java. Если вы не используете StringUtil из apache. Поэтому вам все равно нужно создать StringBuilder, и, следовательно, алгоритм будет немного уродлив: (

КОД: Вот пример вышеупомянутого aproach. Может ли кто-нибудь с компилятором 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

Если вам не нравится зависеть от библиотеки, вы можете использовать комбинацию регулярного выражения и 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("-"));
    }

}

Ответ 6

Вот небольшая вариация ответа Андреаса, которая делает больше, чем ОП запросил:

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

получить банку Apache для StringUtils. Затем вы можете использовать метод capize

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();
    }
}

Ответ 8

Поскольку я не большой поклонник добавления библиотеки только для одного метода, я внедрил свое собственное решение (от случая верблюда до случая змей):

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();
}

Требуется адаптироваться в зависимости от случаев ввода/вывода.

Ответ 9

Для тех, кто имеет библиотеку com.fasterxml.jackson в проекте и не хочет добавлять гуаву, вы можете использовать метод jaskson namingStrategy:

new PropertyNamingStrategy.SnakeCaseStrategy.translate(String);

Ответ 10

Итерировать через строку. Когда вы найдете hypen, удалите его и запишите следующую букву.