Не уверен, но я думаю, что я могу использовать меньше памяти и получать надежную производительность, делая это char-by-char. Я делал что-то подобное, но в циклах в фоновом режиме, поэтому я сейчас пытаюсь это сделать. У меня был некоторый опыт, когда String.split был более дорогим, чем ожидалось. И я работаю над Android и ожидаю, что GC hiccups станет больше проблемой, чем использовать cpu.
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 стоит дорого, заключается в том, что ее ввод является регулярным выражением (не char, как String.indexOf), и он возвращает массив (вместо итератора, потому что цикл использует только одну вещь за раз). Плюс такие случаи, как «AB_AB_AB_AB_AB_AB_AB ...», нарушают эффективность любой массовой копии, а для длинных строк используют на порядок больше памяти, чем входную строку.
В то время как циклирование по символам не имеет канонического случая. Таким образом, накладные расходы на ненужное регулярное выражение и массив кажутся обычно менее предпочтительными (тогда отказ от возможной эффективности массового копирования). Заинтересован услышать мнения / исправления, спасибо.