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

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

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

 import static com.google.common.base.CaseFormat.*; String result = LOWER_HYPHEN.to(LOWER_CAMEL, "do-some-stuff"); 

Следующий метод должен справиться с задачей, достаточно эффективной в 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(); } 

В Java 8 есть, наконец, однострочный :

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

Хотя он требует разделения на 4 фактические строки, чтобы быть parsingчивым ツ

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

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

  1. разделить на “-”
  2. заглавное каждое слово, пропуская первый
  3. присоединиться

EDIT : Поразмыслив … При попытке реализовать это, я обнаружил, что нет простого способа присоединиться к списку строк в 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 } 

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

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

 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 преобразуется в dashBeforeAndAfter
  • some.other$funky:chars? преобразуется в someOtherFunkyChars

получите банку 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(); } } 

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

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

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

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

 new PropertyNamingStrategy.SnakeCaseStrategy.translate(String); 

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

  • Размеры динамических массивов Java?
  • Интерфейсы со статическими полями в java для совместного использования 'констант'
  • добавление ресурсов в intellij для проекта java
  • Запускайте внешнюю программу одновременно и общайтесь с ней через stdin / stdout
  • Разделить строку на пробелы в Java, за исключением того, что между кавычками (например, лечить \ "привет мир \" как один токен)
  • Android - получить реальный путь .txt-файла, выбранного из файла explorer
  • SimpleXML выбрасывает XmlPullParserException, unterminited entity ref без причины
  • Как использовать устаревший HTTP-клиент Apache на Android Marshmallow?
  • Как я могу получить результаты сканирования Android Wifi в список?
  • Изменение размера изображения до полной ширины и фиксированной высоты с помощью Picasso
  • Программно скрыть / показать Android Soft Keyboard
  • Interesting Posts

    Перспективы всегда отправляются с одного и того же адреса

    Согласование нескольких шаблонов

    Возвращает нулевой плохой дизайн?

    Как использовать условные обозначения при замене в Notepad ++ с помощью регулярных выражений

    Как выйти из цикла автоматического ремонта в Windows 8?

    Порядок выполнения в списке инициализации конструктора

    Как подключиться через HTTPS с помощью Jsoup?

    Случайный формат

    Что такое TCP Half Open Connection и TCP half closed connection

    Структура Maven и JSF webapp, где именно для размещения ресурсов JSF

    Закрывать опцию крышки «Ничего не делать» отсутствует

    «pip install» терпит неудачу для каждого пакета («Не удалось найти версию, которая удовлетворяет требованиям»)

    Восстановить пул ZFS после создания над ним

    Папка поиска Outlook. Как фильтровать сообщения, имеющие одну категорию, но не имеющих другой?

    Как получить первый день номера данной недели в Java

    Давайте будем гением компьютера.