Це правильний спосіб перетворення знаку в String на 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());
} 

Це надійний метод перетворення a charна StringJava? Це кращий спосіб? Я не знаю багато чого про 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
Не існує єдиного «правильного» шляху. Мабуть, принаймні п’ять способів зробити це: який ви виберете, залежить стільки від моди, скільки від наукового факту. Більшість часу це просто не має значення, і тестова програма, безумовно, є одним із таких випадків.
користувач207421

@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
@Neil Whew! Я починав думати, що тип людини, про яку я написав цю виноску, більше не існує на стеку Overflow :)
Robby Cornelissen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.