Como posso converter ArrayList <Object> em ArrayList <String>?

94
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());

Eu tentei:

ArrayList<String> list2 = (String)list; 

Mas me deu um erro de compilação.

rtf
fonte
5
Por que você quer fazer isso? Quero dizer, não é seguro. Dê uma olhada no exemplo.
athspk
6
Você está colocando não-strings na lista. Qual é a sua expectativa do que acontecerá se você os forçar a serem cordas?
Ben Zotto
5
Presumo que você quisesse dizer: ArrayList <String> list2 = (ArrayList <String>) list;
Costi Ciudatu

Respostas:

130

Uma vez que este é , na verdade, não é uma lista de strings, a maneira mais fácil é fazer um loop sobre ele e converter cada item em uma nova lista de seqüências de si mesmo:

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

Ou quando você ainda não está no Java 8:

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

Ou quando você ainda não está no Java 7:

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

Observe que você deve declarar em relação à interface ( java.util.Listneste caso), não à implementação.

BalusC
fonte
6
Eu gosto de como os valores nulos são preservados nesta implementação.
4
Se você usar String.valueOf(object), você não terá que fazer a object != null ? object.toString() : nullcoisa
certa
2
@Tomas: adicionaria uma string com valor em "null"vez do literal null. Depende ainda das exigências de negócios se isso é desejável ou não. Para mim, não teria sido aceitável, já que introduz um bug potencialmente importante.
BalusC de
1
@Tomas: "null"não é null. O nulltem um significado especial em Java. Não faz sentido ser forçado a fazer isso if (item.equals("null"))ao verificar isso posteriormente.
BalusC
1
@Tomas: você está apenas derrotando a forte natureza de digitação do Java dessa forma. Mas, como disse, depende dos requisitos de negócios se isso é desejável. Para mim, isso é simplesmente inaceitável. Faça o que quiser e o tempo ensinará :)
BalusC 28/11/12
18

Não é seguro fazer isso!
Imagine se você tivesse:

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

Não faria sentido converter a lista desses objetos em qualquer tipo.

athspk
fonte
1
A menos que eles tenham o Object#toString()método substituído. No entanto, toda a conversão de tipo de X em String para outros fins que não a apresentação humana realmente não faz muito sentido.
BalusC
13

Se você quiser fazer da maneira suja, tente fazer isso.

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

Vantagem: aqui você economiza tempo ao não iterar todos os objetos.

Desvantagem: pode causar um buraco no pé.

Per Lindberg
fonte
12

Usando goiaba :

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";
    }
});
Emil
fonte
11

Usando Java 8, você pode fazer:

List<Object> list = ...;
List<String> strList = list.stream()
                           .map( Object::toString )
                           .collect( Collectors.toList() );
Scadge
fonte
10

Você pode usar um caractere curinga para fazer isso da seguinte forma

ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Hellrocker
fonte
8

Aqui está outra alternativa usando goiaba

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

Seu código ArrayList<String> list2 = (String)list;não compila porque list2não é do tipo String. Mas esse não é o único problema.

fastcodejava
fonte
0

Usando 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)));
Ankush soni
fonte
0

Com Java Generics obtém uma lista de X e retorna uma lista de T que estende ou implementa X, Sweet!

    // 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;
}
Apenas eu
fonte
0

Uma solução simples:

List<Object> lst  =listOfTypeObject;   
ArrayList<String> aryLst = new ArrayList<String>();
    for (int i = 0; i < lst.size(); i++) {
        aryLst.add(lst.get(i).toString());
    }

Observação: isso funciona quando a lista contém todos os elementos do tipo de dados String.

S Krishna
fonte