2011-01-03 23 views
62
ArrayList<Object> list = new ArrayList<Object>(); 
list.add(1); 
list.add("Java"); 
list.add(3.14); 
System.out.println(list.toString()); 

me trataron:¿Cómo puedo convertir ArrayList <Object> en ArrayList <String>?

ArrayList<String> list2 = (String)list; 

pero me dio un error de compilación.

+5

¿Por qué quieres hacer eso? Quiero decir que no es seguro. Echa un vistazo al ejemplo. – athspk

+6

Está colocando cadenas en la lista. ¿Cuál es su expectativa de lo que sucederá si los fuerza a ser cadenas? –

+5

Supongo que se refería a: ArrayList lista2 = lista (ArrayList ); –

Respuesta

85

Dado que este es en realidad no es una lista de cadenas, la forma más fácil es lazo sobre él y convertir cada elemento en una nueva lista de cadenas de sí mismo:

List<String> strings = list.stream() 
    .map(object -> Objects.toString(object, null)) 
    .collect(Collectors.toList()); 

O cuando no estás en Java 8 aún:

List<String> strings = new ArrayList<>(list.size()); 
for (Object object : list) { 
    strings.add(Objects.toString(object, null)); 
} 

O cuando no estás en Java 7 todavía:

List<String> strings = new ArrayList<>(list.size()); 
for (Object object : list) { 
    strings.add(object != null ? object.toString() : null); 
} 

Tenga en cuenta que debe declarar en contra de la interfaz (java.util.List en este caso), no la implementación.

+6

Me gusta cómo se preservan los valores nulos esta implementación. –

+3

Si usa 'String.valueOf (object)', no tendrá que hacer el 'object! = Null? object.toString(): null' thing – user219882

+2

@Tomas: agregaría una cadena con el valor '" null "' en lugar del literal 'null'. Depende más de los reembolsos de negocios, ya sea deseable o no. Para mí, no habría sido aceptable en absoluto, ya que introduce un error potencialmente importante. – BalusC

16

¡No es seguro hacer eso!
Imagínese si usted tenía:

ArrayList<Object> list = new ArrayList<Object>(); 
list.add(new Employee("Jonh")); 
list.add(new Car("BMW","M3")); 
list.add(new Chocolate("Twix")); 

No tendría sentido para convertir la lista de los objetos de cualquier tipo.

+1

A menos que tengan ['Object # toString()'] (http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#toString%28% 29) método anulado. Sin embargo, la conversión de todo el tipo de X a String para otros fines además de la presentación humana, de hecho no tiene mucho sentido. – BalusC

4

Su código ArrayList<String> list2 = (String)list; no se compila porque list2 no es del tipo String. Pero ese no es el único problema.

11

Usando guava:

List<String> stringList=Lists.transform(list,new Function<Object,String>(){ 
    @Override 
    public String apply(Object arg0) { 
     if(arg0!=null) 
      return arg0.toString(); 
     else 
      return "null"; 
    } 
}); 
4

Aquí hay otra alternativa que utiliza Guava

List<Object> lst ...  
List<String> ls = Lists.transform(lst, Functions.toStringFunction()); 
10

Si desea hacerlo de la manera sucia, prueba esto.

@SuppressWarnings("unchecked") 
public ArrayList<String> convert(ArrayList<Object> a) { 
    return (ArrayList) a; 
} 

Ventaja: aquí ahorra tiempo al no iterar sobre todos los objetos.

Desventaja: puede producir un agujero en el pie.

6

Uso de Java 8 que puede hacer:

List<Object> list = ...; 
List<String> strList = list.stream() 
          .map(Object::toString) 
          .collect(Collectors.toList()); 
-1

Uso de Java 8 lambda:

ArrayList<Object> obj = new ArrayList<>(); 
obj.add(1); 
obj.add("Java"); 
obj.add(3.14); 

ArrayList<String> list = new ArrayList<>(); 
obj.forEach((xx) -> list.add(String.valueOf(xx))); 
0

Con Java Generics toma una lista de X y devuelve una lista de T que se extiende o implementos X, ¡Dulce!

// the cast is is actually checked via the method API 
@SuppressWarnings("unchecked") 
public static <T extends X, X> ArrayList<T> convertToClazz(ArrayList<X> from, Class<X> inClazz, Class<T> outClazz) { 
    ArrayList<T> to = new ArrayList<T>(); 
    for (X data : from) { 
     to.add((T) data); 
    } 
    return to; 
} 
6

Puede utilizar comodines para hacer esto de la siguiente manera

ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list); 
Cuestiones relacionadas