Это правильный способ преобразования символа в строку в Java? [Дубликат]

20

При написании модульных тестов для функции, возвращающей booleanдве Stringсекунды, мне нужно было проверить каждый символ алфавита ( 'a'- 'z') последовательно как один из параметров, один за другим, поэтому я написал это для этого:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, new String(c));
} 

Я бы подумал, что это допустимо, но это не так, поэтому я просто сделал это так:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
} 

Является ли это надежный способ преобразовать charк Stringв Java? Это предпочтительный способ? Я не очень много знаю о Java, поэтому хотел бы получить разъяснения по этому поводу.

Говинд Пармар
источник
2
Не прямо на ваш вопрос, но я быIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Эллиот Фриш
3
@ElliottFrisch но почему? Потоки здесь не нужны, но даже если вы настаиваете на использовании потоков для каждого цикла, почему бы хотя бы не использовать IntStream.rangeClosed('a', 'z')?
PhilipRoman
1
Единого «правильного» пути не существует. Вероятно, есть как минимум пять способов сделать это: выбор, который вы выбираете, зависит как от моды, так и от научного факта. В большинстве случаев это просто не имеет значения, и тестовая программа, безусловно, является одним из таких случаев.
user207421
@PhilipRoman Потому что это там (Эдмунд Хиллари). Потому что я могу. Потому что мы хотим (Билли Пайпер, я думаю). Это тоже классный подход.
Эллиот Фриш
Я бы подумал, что это допустимо. Вы думали, что допустимо вызывать Stringконструктор, который не существует? Поправьте меня, если я ошибаюсь, но, насколько мне известно, в классе нет конструктора, Stringкоторый принимает один charаргумент. Обратите внимание, что charэто не то же самое, что char[].
Абра

Ответы:

33

Самое короткое решение:

char c = 'a';
String s = "" + c;

Самые чистые (и, вероятно, наиболее эффективные 1 ) решения:

char c = 'a';

String s1 = String.valueOf(c);
// or
String s2 = Character.toString(c);

По сравнению с вашим подходом, вышеописанное предотвращает накладные расходы, связанные с упаковкой примитива в Characterобъект.


1 Небольшая неэффективность конкатенации строк в первом подходе может быть оптимизирована компилятором или средой выполнения, поэтому один (если бы он был так склонен) действительно должен был бы запустить микропроцессор для определения фактической производительности. Подобные микрооптимизации редко стоят усилий, и использование конкатенации для принудительного преобразования строк выглядит не очень хорошо.

Робби Корнелиссен
источник
6
В прошлый раз, когда я смотрел, javacкомпилятор Sun автоматически трансформируется String s = "" + c;в String s = String.valueOf(c);, поэтому производительность будет такой же.
Нейл
4
@ Нил Уфф! Я начинал думать, что тот тип человека, для которого я написал эту сноску, больше не существует в Переполнении стека :)
Робби Корнелиссен