Lors de l'écriture de tests unitaires pour une fonction de retour boolean
qui prend deux String
s, 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 char
un String
en 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.
IntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
IntStream.rangeClosed('a', 'z')
?String
constructeur qui n'existe pas? Corrigez-moi si je me trompe, mais pour autant que je sache, il n'y a pas de constructeur en classeString
qui accepte un seulchar
argument. Notez que cechar
n'est pas la même chose quechar[]
.Réponses:
La solution la plus courte:
Les solutions les plus propres (et probablement les plus efficaces 1 ):
Par rapport à votre approche, ce qui précède évite aux frais généraux d'avoir à encadrer la primitive dans un
Character
objet.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.
la source
javac
compilateur de Sun se transforme automatiquementString s = "" + c;
enString s = String.valueOf(c);
, donc les performances seraient les mêmes.