Tengo una lista de enteros List<Integer>
y me gustaría convertir todos los objetos enteros en cadenas, terminando así con un nuevo List<String>
.
Naturalmente, podría crear un nuevo List<String>
y recorrer la lista llamando String.valueOf()
a cada número entero, pero me preguntaba si había una forma mejor (léase: más automática ) de hacerlo.
java
string
collections
integer
ChrisThomas123
fuente
fuente
Usando Google Collections de Guava-Project , puede usar el
transform
método en la clase ListsEl
List
devuelto portransform
es una vista en la lista de respaldo: la transformación se aplicará en cada acceso a la lista transformada.Tenga en cuenta que
Functions.toStringFunction()
arrojará unNullPointerException
cuando se aplique a nulo, por lo que solo utilícelo si está seguro de que su lista no contendrá nulos.fuente
Solución para Java 8. Un poco más largo que el de Guava, pero al menos no tienes que instalar una biblioteca.
fuente
toString
ejemplo, termina siendo más corto para las conversiones que no son compatibles con la biblioteca de funciones de Guava. Las funciones personalizadas siguen siendo fáciles, pero es mucho más código que esta transmisión de Java 8Lo que está haciendo está bien, pero si siente la necesidad de 'Java-it-up', puede usar un Transformer y el método de recopilación de Apache Commons , por ejemplo:
..y entonces..
fuente
La fuente de String.valueOf muestra esto:
No es que importe mucho, pero usaría toString.
fuente
En lugar de usar String.valueOf, usaría .toString (); evita parte del boxeo automático descrito por @ johnathan.holland
El javadoc dice que valueOf devuelve lo mismo que Integer.toString ().
fuente
Aquí hay una solución de una sola línea sin trampas con una biblioteca que no es JDK.
fuente
Otra solución usando Guava y Java 8
fuente
No es Java central ni genérico, pero la popular biblioteca de colecciones de bienes comunes de Yakarta tiene algunas abstracciones útiles para este tipo de tarea. Específicamente, eche un vistazo a los métodos de recopilación en
ColecciónUtils
Algo a tener en cuenta si ya está utilizando colecciones comunes en su proyecto.
fuente
Para las personas preocupadas por el "boxeo" en la respuesta de jsight: no hay ninguno.
String.valueOf(Object)
se utiliza aquí, yint
nunca se realiza un desempaquetado .Si usa
Integer.toString()
oString.valueOf(Object)
depende de cómo quiera manejar posibles nulos. ¿Desea lanzar una excepción (probablemente) o tener cadenas "nulas" en su lista (tal vez)? Si es el primero, ¿quieres lanzar unoNullPointerException
o algún otro tipo?Además, una pequeña falla en la respuesta de jsight:
List
es una interfaz, no puede usar el nuevo operador en ella. Probablemente usaría unjava.util.ArrayList
en este caso, especialmente porque sabemos de antemano cuánto es probable que sea la lista.fuente
fuente
@Jonathan: Podría estar equivocado, pero creo que String.valueOf () en este caso llamará a la función String.valueOf (Object) en lugar de encuadrarse en String.valueOf (int). String.valueOf (Object) simplemente devuelve "nulo" si es nulo o llama a Object.toString () si no es nulo, lo que no debería involucrar el boxeo (aunque obviamente la instanciación de nuevos objetos de cadena está involucrada).
fuente
Creo que usar Object.toString () para cualquier propósito que no sea la depuración es probablemente una muy mala idea, aunque en este caso los dos son funcionalmente equivalentes (asumiendo que la lista no tiene nulos). Los desarrolladores son libres de cambiar el comportamiento de cualquier método toString () sin ninguna advertencia, incluidos los métodos toString () de cualquier clase en la biblioteca estándar.
Ni siquiera se preocupe por los problemas de rendimiento causados por el proceso de empaquetado / desembalaje. Si el rendimiento es crítico, simplemente use una matriz. Si es realmente crítico, no use Java. Tratar de ser más astuto que la JVM solo conducirá a dolores de cabeza.
fuente
Una respuesta solo para expertos:
fuente
String
) compartirá la misma matriz de respaldo (desdeall
), por lo que en realidad será bastante eficiente en memoria, lo que sería importante para el rendimiento a largo plazo. A menos que solo desee mantener uno de los elementos, por supuesto ...Lambdaj permite hacer eso de una manera muy simple y legible. Por ejemplo, suponiendo que tenga una lista de Integer y quiera convertirlos en la representación de String correspondiente, podría escribir algo así;
Lambdaj aplica la función de conversión solo mientras está iterando sobre el resultado.
fuente
No puede evitar la "sobrecarga de boxeo"; Los contenedores genéricos falsos de Java solo pueden almacenar objetos, por lo que sus entradas deben estar encasilladas en enteros. En principio, podría evitar la caída de Object a Integer (ya que no tiene sentido, porque Object es lo suficientemente bueno para String.valueOf y Object.toString) pero no sé si el compilador es lo suficientemente inteligente para hacer eso. La conversión de String a Object debería ser más o menos una operación no operativa, por lo que no estaría dispuesto a preocuparme por eso.
fuente
Podemos usar el iterador para lograr lo mismo.
fuente
Usando Streams: Si digamos que el resultado es una lista de enteros (
List<Integer> result
) entonces:Una de las formas de solucionarlo. Espero que esto ayude.
fuente
Una solución un poco más concisa usando el método forEach en la lista original:
fuente
Solo por diversión, una solución que usa el marco de unión de bifurcación jsr166y que debería estar en JDK7.
(Descargo de responsabilidad: no compilado. Las especificaciones no están finalizadas. Etc.)
Es poco probable que esté en JDK7 es un poco de inferencia de tipo y azúcar sintáctico para hacer que la llamada con Mapping sea menos detallada:
fuente
Esto es algo tan básico que no usaría una biblioteca externa (causará una dependencia en su proyecto que probablemente no necesite).
Tenemos una clase de métodos estáticos diseñados específicamente para realizar este tipo de trabajos. Debido a que el código para esto es tan simple, dejamos que Hotspot haga la optimización por nosotros. Este parece ser un tema en mi código recientemente: escriba un código muy simple (directo) y deje que Hotspot haga su magia. Rara vez tenemos problemas de rendimiento con un código como este: cuando aparece una nueva versión de VM, obtiene todos los beneficios de velocidad adicionales, etc.
Por mucho que me gusten las colecciones de Yakarta, no son compatibles con Genéricos y usan 1.4 como LCD. ¡Desconfío de las colecciones de Google porque se enumeran como nivel de soporte Alpha!
fuente
Solo quería intervenir con una solución orientada a objetos al problema.
Si modela objetos de dominio, la solución está en los objetos de dominio. El dominio aquí es una lista de enteros para los que queremos valores de cadena.
La forma más sencilla sería no convertir la lista en absoluto.
Dicho esto, para convertir sin convertir, cambie la lista original de Integer a List of Value, donde Value se parece a esto ...
Esto será más rápido y ocupará menos memoria que copiar la lista.
¡Buena suerte!
fuente