Каков самый элегантный способ преобразования разделенного дефиса слова (например, "do-some-stuff" ) в более низкое изменение верблюжьего случая (например, "doSomeStuff" ) в Java?
Каков самый элегантный способ конвертировать дефисное слово (например, "делать что-то" ) в более низкое значение верблюжьего случая (например, "doSomeStuff" )?
Ответ 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, удалите его и запишите следующую букву.