Est-ce la bonne façon de convertir un caractère en une chaîne en Java? [dupliquer]


20

Lors de l'écriture de tests unitaires pour une fonction de retour booleanqui prend deux Strings, et j'avais besoin de tester chaque caractère de l'alphabet ( 'a'- 'z') en séquence comme l'un des paramètres, un par un, alors j'ai écrit ceci pour le faire:

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

J'aurais pensé que c'était permis, mais ce n'était pas le cas, alors je l'ai fait comme ceci à la place:

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

Est-ce une méthode fiable pour convertir charun Stringen Java? Est-ce la voie préférée? Je ne sais pas grand-chose sur Java, donc j'aimerais avoir des éclaircissements à ce sujet.


2
Pas directement à votre question, mais je le feraisIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Elliott Frisch

3
@ElliottFrisch mais pourquoi? Les flux ne sont pas nécessaires ici, mais même si vous insistez pour utiliser des flux pour chaque boucle, pourquoi ne pas utiliser au moins IntStream.rangeClosed('a', 'z')?
PhilipRoman

1
Il n'y a pas de voie «correcte» unique. Il existe probablement au moins cinq façons de procéder: celle que vous choisissez dépend autant de la mode que des faits scientifiques. La plupart du temps, cela n'a pas d'importance, et un programme de test est certainement l'un de ces cas.
user207421

@PhilipRoman Parce qu'il est là (Edmund Hillary). Parce que je peux. Parce que nous voulons (Billie Piper, je pense). C'est aussi une approche cool.
Elliott Frisch

J'aurais pensé que c'était permis Vous pensiez qu'il était permis d'invoquer un Stringconstructeur qui n'existe pas? Corrigez-moi si je me trompe, mais pour autant que je sache, il n'y a pas de constructeur en classe Stringqui accepte un seul charargument. Notez que ce charn'est pas la même chose que char[].
Abra Il y a

Réponses:


33

La solution la plus courte:

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

Les solutions les plus propres (et probablement les plus efficaces 1 ):

char c = 'a';

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

Par rapport à votre approche, ce qui précède évite aux frais généraux d'avoir à encadrer la primitive dans un Characterobjet.


1 La légère inefficacité de la concaténation de chaînes dans la première approche pourrait être optimisée par le compilateur ou le runtime, de sorte qu'un (si l'un était si incliné) devrait vraiment exécuter un micro-benchmark pour déterminer les performances réelles. Les micro-optimisations comme celle-ci valent rarement la peine, et s'appuyer sur la concaténation pour forcer la conversion de chaînes n'est pas très joli.


6
La dernière fois que j'ai regardé, le javaccompilateur de Sun se transforme automatiquement String s = "" + c;en String s = String.valueOf(c);, donc les performances seraient les mêmes.
Neil

4
@Neil Whew! Je commençais à penser que le type de personne pour qui j'avais écrit cette note de bas de page n'existait plus sur Stack Overflow :)
Robby Cornelissen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.