Не уверен, но я думаю, что смогу использовать меньше памяти и получить надежную производительность, выполняя ее char-by-char. Я делал что-то подобное, но в циклах в фоновых потоках, поэтому я пытаюсь это сейчас. У меня был некоторый опыт работы с String.split, который оказался дороже, чем ожидалось. И я работаю над Android и ожидаю, что сбой GC станет более серьезной проблемой, чем использование процессора.
public static String toCamelCase(String value) {
StringBuilder sb = new StringBuilder();
final char delimChar = '_';
boolean lower = false;
for (int charInd = 0; charInd < value.length(); ++charInd) {
final char valueChar = value.charAt(charInd);
if (valueChar == delimChar) {
lower = false;
} else if (lower) {
sb.append(Character.toLowerCase(valueChar));
} else {
sb.append(Character.toUpperCase(valueChar));
lower = true;
}
}
return sb.toString();
}
Намек на то, что String.split дорогой, заключается в том, что его входные данные являются регулярным выражением (а не символом, подобным String.indexOf) и возвращают массив (вместо, скажем, итератора, поскольку цикл использует только одну вещь за раз). Плюс такие случаи, как "AB_AB_AB_AB_AB_AB ...", снижают эффективность любой объемной копии, а для длинных строк используют на порядок больше памяти, чем входная строка.
Принимая во внимание, что цикл через символы не имеет канонического случая. Поэтому мне кажется, что издержки из-за ненужных регулярных выражений и массива, как правило, менее предпочтительны (чем отказ от возможной эффективности массового копирования). Заинтересованы услышать мнения / исправления, спасибо.