Pregunta

Tengo una lista de números enteros, List<Integer> y me gustaría convertir todos los enteros objetos en Cadenas, acabando así con una nueva List<String>.

Naturalmente, podría crear un nuevo List<String> y el bucle a través de la lista de llamadas String.valueOf() para cada entero, pero me preguntaba si había una mejor (leer: más automático) forma de hacerlo?

¿Fue útil?

Solución

Hasta donde yo sé, iterar y crear una instancia es la única manera de hacer esto.Algo así como para otros potenciales ayudar, ya que estoy seguro de que usted sabe cómo hacer esto):

List<Integer> oldList = ...
/* Specify the size of the list up front to prevent resizing. */
List<String> newList = new ArrayList<String>(oldList.size()) 
for (Integer myInt : oldList) { 
  newList.add(String.valueOf(myInt)); 
}

Otros consejos

El uso de Google Colecciones de Guayaba-Proyecto, usted podría utilizar la transform método en el Las listas de clase

import com.google.common.collect.Lists;
import com.google.common.base.Functions

List<Integer> integers = Arrays.asList(1, 2, 3, 4);

List<String> strings = Lists.transform(integers, Functions.toStringFunction());

El List devuelto por transform es un ver en el respaldo de la lista de la transformación serán aplicados en cada acceso a la transformada de la lista.

Ser consciente de que Functions.toStringFunction() va a lanzar una NullPointerException cuando se aplica a null, por lo que sólo lo use si usted está seguro de que su lista no contener null.

Solución para Java 8.Un poco más largo que el de la Guayaba uno, pero al menos usted no tiene que instalar una biblioteca.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

//...

List<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<String> strings = integers.stream().map(Object::toString)
                                        .collect(Collectors.toList());

Lo que estás haciendo está bien, pero si usted siente la necesidad de "Java-it-up' se podría utilizar un Transformador y el método collect de Apache Commons, por ejemplo:

public class IntegerToStringTransformer implements Transformer<Integer, String> {
   public String transform(final Integer i) {
      return (i == null ? null : i.toString());
   }
}

..y entonces..

CollectionUtils.collect(
   collectionOfIntegers, 
   new IntegerToStringTransformer(), 
   newCollectionOfStrings);

El origen de la Cadena.valueOf muestra esto:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

No es que importe mucho, pero me gustaría utilizar el método toString.

En lugar de utilizar la Cadena.valueOf yo uso .toString();evita algunos de los auto de boxeo descrito por @johnathan.holanda

El javadoc dice que valueOf devuelve la misma cosa como Entero.toString().

List<Integer> oldList = ...
List<String> newList = new ArrayList<String>(oldList.size());

for (Integer myInt : oldList) { 
  newList.add(myInt.toString()); 
}

He aquí un one-liner solución sin hacer trampa con un no-JDK de la biblioteca.

List<String> strings = Arrays.asList(list.toString().replaceAll("\\[(.*)\\]", "$1").split(", "));

Otra Solución mediante la Guayaba y Java 8

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> strings = Lists.transform(numbers, number -> String.valueOf(number));

En el núcleo de Java, y no genérico-ified, pero el popular Jakarta commons colecciones de la biblioteca tiene algunas abstracciones útiles para este tipo de tarea.Específicamente, eche un vistazo a recoger a los métodos de la

CollectionUtils

Algo a considerar si usted ya está usando commons colecciones en su proyecto.

A las personas interesadas acerca de "boxeo" en jsight la respuesta:no hay ninguno. String.valueOf(Object) se utiliza aquí, y no unboxing para int es la historia.

Ya sea que usted use Integer.toString() o String.valueOf(Object) depende de cómo desea manejar los posibles valores nulos.¿Quieres lanzar una excepción (probablemente), o "null" Cadenas en su lista (tal vez).Si el anterior, ¿quieres lanzar una NullPointerException o de algún otro tipo?

También, un pequeño defecto en jsight la respuesta: List es una interfaz, no se puede utilizar el operador new en él.Probablemente yo uso un java.util.ArrayList en este caso, sobre todo desde que sabemos de antemano cuánto tiempo la lista es probable que sea.

@Jonathan:Puedo estar equivocado, pero creo que esa Cadena.valueOf() en este caso va a llamar a la Cadena.valueOf(Objeto) de la función en lugar de poner en caja a la Cadena.valueOf(int).De la cadena.valueOf(Objeto) sólo devuelve "null" si es null o llamadas de Objeto.toString() si es no nulo, lo cual no debe implicar de boxeo (aunque, obviamente, crear instancias de los nuevos objetos de cadena está involucrado).

Creo que el uso de Objetos.toString() para cualquier otro propósito que la depuración es probablemente una mala idea, aunque en este caso los dos son funcionalmente equivalentes (suponiendo que la lista no tiene valores nulos).Los desarrolladores son libres de cambiar el comportamiento de cualquier método toString() sin ningún tipo de advertencia, incluyendo el método toString() los métodos de las clases de la biblioteca estándar.

No se preocupe por los problemas de rendimiento provocados por el boxing/unboxing proceso.Si el rendimiento es crítico, sólo tiene que utilizar una matriz.Si es realmente importante, no el uso de Java.Tratando de ser más astuto que el JVM sólo puede conducir a la angustia.

Una respuesta solo para expertos:

    List<Integer> ints = ...;
    String all = new ArrayList<Integer>(ints).toString();
    String[] split = all.substring(1, all.length()-1).split(", ");
    List<String> strs = Arrays.asList(split);

Lambdaj permite hacer eso de una manera muy simple y legible.Por ejemplo, suponiendo que tienes una lista de Enteros y que desea convertir en la correspondiente representación de Cadena podría escribir algo como esto;

List<Integer> ints = asList(1, 2, 3, 4);
Iterator<String> stringIterator = convertIterator(ints, new Converter<Integer, String> {
    public String convert(Integer i) { return Integer.toString(i); }
}

Lambdaj se aplica la función de conversión sólo mientras está iterando sobre el resultado.

Usted no puede evitar el "boxeo de sobrecarga";Java falsa genérico contenedores sólo puede almacenar Objetos, por lo que su enteros debe ser encasillados en números Enteros.En principio, se podría evitar el abatido de un Objeto a Entero (ya que no tiene sentido, porque el Objeto es lo suficientemente buena para ambos la Cadena.valueOf y el Objeto.toString), pero no sé si el compilador es lo suficientemente inteligente como para hacer eso.La conversión de Cadena a Objeto debe ser más o menos un no-op, por lo que se sentirá inclinado a preocuparse de que uno.

Sólo por diversión, una solución mediante el jsr166y tenedor de unirse marco en el JDK7.

import java.util.concurrent.forkjoin.*;

private final ForkJoinExecutor executor = new ForkJoinPool();
...
List<Integer> ints = ...;
List<String> strs =
    ParallelArray.create(ints.size(), Integer.class, executor)
    .withMapping(new Ops.Op<Integer,String>() { public String op(Integer i) {
        return String.valueOf(i);
    }})
    .all()
    .asList();

(Descargo de responsabilidad:No se compila.Especificación no está finalizado.Etc.)

Raro estar en JDK7 es un poco de inferencia de tipos y sintácticos de azúcar para hacer que withMapping llamar menos detallado:

    .withMapping(#(Integer i) String.valueOf(i))

Esto es una cosa básica que hacer yo no usaría una biblioteca externa (se hará una dependencia en el proyecto que usted probablemente no necesite).

Tenemos una clase de métodos estáticos específicamente diseñado para hacer este tipo de trabajos.Debido a que el código es tan simple que permita Hotspot hacer la optimización para nosotros.Este parece ser un tema en mi código recientemente:escribir muy simple (sencillo) código y dejar Hotspot hacer su magia.Pocas veces tenemos problemas de rendimiento en torno a un código como este - cuando una nueva VM versión viene usted obtiene todas las ventajas de la velocidad, etc.

Por mucho que me encanta Yakarta colecciones, que no admiten los medicamentos Genéricos y de uso 1.4 como el LCD.Tengo dudas acerca de Google Colecciones porque son mencionados como el Alfa de soporte de nivel!

Yo no veo ninguna solución que está siguiendo el director de espacio de la complejidad.Si la lista de números enteros tiene gran número de elementos, entonces es gran problema.

It will be really good to remove the integer from the List<Integer> and free
the space, once it's added to List<String>.

Podemos utilizar un iterador para lograr el mismo.

    List<Integer> oldList = new ArrayList<>();
    oldList.add(12);
    oldList.add(14);
    .......
    .......

    List<String> newList = new ArrayList<String>(oldList.size());
    Iterator<Integer> itr = oldList.iterator();
    while(itr.hasNext()){
        newList.add(itr.next().toString());
        itr.remove();
    }

Yo sólo quería hablar con un objeto orientado a la solución del problema.

Si el modelo de objetos del dominio, entonces la solución está en los objetos de dominio.El dominio aquí está una Lista de enteros para que queremos los valores de cadena.

La manera más fácil sería para no convertir la lista en absoluto.

Dicho esto, con el fin de convertir sin convertir, cambiar la lista original de número Entero a la Lista de Valor, donde el Valor se ve algo como esto...

class Value {
    Integer value;
    public Integer getInt()
    {
       return value;
    }
    public String getString()
    {
       return String.valueOf(value);
    }
}

Esto será más rápido y ocupan menos memoria que la copia de la Lista.

Buena Suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top