Mientras escribía las pruebas unitarias para una función boolean
que regresa que toma dos String
s, y necesitaba probar cada carácter del alfabeto ( 'a'
- 'z'
) en secuencia como uno de los parámetros, uno por uno, así que escribí esto para hacer eso:
for(char c = 'a'; c <= 'z'; c++)
{
assertTrue(MyClass.MyFunction(testSubject, new String(c));
}
Pensé que esto era permisible, pero no lo era, así que lo hice así:
for(char c = 'a'; c <= 'z'; c++)
{
assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
}
¿Es este un método confiable para convertir char
a a String
en Java? ¿Es la forma preferida? No sé mucho acerca de Java, por lo que me gustaría una aclaración al respecto.
IntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
IntStream.rangeClosed('a', 'z')
?String
constructor que no existe? Corrígeme si me equivoco, pero que yo sepa, no hay un constructor en claseString
que tome un solochar
argumento. Tenga en cuenta quechar
no es lo mismo quechar[]
.Respuestas:
La solución más corta:
Las soluciones más limpias (y probablemente las más eficientes 1 ):
En comparación con su enfoque, lo anterior evita la sobrecarga de tener que encajonar lo primitivo en un
Character
objeto.1 El compilador o el tiempo de ejecución podrían optimizar la leve ineficiencia de la concatenación de cadenas en el primer enfoque, por lo que uno (si uno estuviera tan inclinado) realmente tendría que ejecutar un micro-punto de referencia para determinar el rendimiento real. Las micro optimizaciones como esta rara vez valen la pena, y confiar en la concatenación para forzar la conversión de cadenas simplemente no se ve muy bien.
fuente
javac
compilador transforma automáticamenteString s = "" + c;
enString s = String.valueOf(c);
, por lo que el rendimiento sería el mismo.