Essa é a maneira correta de converter um caractere em uma String em Java? [duplicado]

20

Enquanto escrevia testes de unidade para uma função booleanque retorna dois Stringsegundos, e eu precisava testar todos os caracteres do alfabeto ( 'a'- 'z') em sequência como um dos parâmetros, um por um, então escrevi isso para fazer isso:

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

Eu teria pensado que isso era permitido, mas não era, então eu fiz assim:

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

Este é um método confiável para converter um charpara um Stringem Java? É o caminho preferido? Eu não sei muito sobre Java, então gostaria de alguns esclarecimentos sobre isso.

Govind Parmar
fonte
2
Não diretamente para sua pergunta, mas eu fariaIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Elliott Frisch
3
@ElliottFrisch mas por quê? Os fluxos são desnecessários aqui, mas mesmo se você insistir em usar fluxos para cada loop, por que não usar pelo menos IntStream.rangeClosed('a', 'z')?
PhilipRoman 28/04
11
Não existe uma maneira única 'correta'. Provavelmente, existem pelo menos cinco maneiras de fazer isso: a sua escolha depende tanto da moda quanto dos fatos científicos. Na maioria das vezes, isso simplesmente não importa, e um programa de teste é certamente um desses casos.
user207421 28/04
@ PhilipRoman Porque está lá (Edmund Hillary). Porque eu posso. Porque nós queremos (Billie Piper, eu acho). Essa é uma abordagem legal também.
Elliott Frisch
Eu teria pensado que isso era permitido Você pensou que era permitido chamar um Stringconstrutor que não existe? Corrija-me se estiver errado, mas até onde sei, não há construtor na classe Stringque use um único charargumento. Observe que charnão é o mesmo que char[].
Abra

Respostas:

33

A solução mais curta:

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

As soluções mais limpas (e provavelmente mais eficientes 1 ):

char c = 'a';

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

Comparado à sua abordagem, o acima evita a sobrecarga de colocar o primitivo em um Characterobjeto.


1 A leve ineficiência da concatenação de strings na primeira abordagem pode ser otimizada pelo compilador ou pelo tempo de execução; portanto, um (se um deles estiver muito inclinado) precisaria realmente executar uma micro-referência para determinar o desempenho real. Micro-otimizações como essa raramente valem o esforço, e confiar na concatenação para forçar a conversão de strings simplesmente não parece muito bom.

Robby Cornelissen
fonte
6
Última vez que olhei, da Sun javaccompilador transforma automaticamente String s = "" + c;em String s = String.valueOf(c);, de modo que o desempenho seria o mesmo.
Neil
4
@Neil Whew! Eu estava começando a pensar que o tipo de pessoa que eu escrevi na nota de rodapé não existia mais no Stack Overflow :)
Robby Cornelissen