Come posso convertire ArrayList <Object> in ArrayList <String>?


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

Provai:

ArrayList<String> list2 = (String)list; 

Ma mi ha dato un errore di compilazione.


5
Perché vuoi farlo? Voglio dire, non è sicuro. Dai un'occhiata all'esempio.
athspk

6
Stai inserendo non stringhe nell'elenco. Qual è la tua aspettativa di ciò che accade se li costringi ad essere stringhe?
Ben Zotto

5
Presumo che tu intendessi: ArrayList <String> list2 = (ArrayList <String>) list;
Costi Ciudatu

Risposte:


130

Poiché questo in realtà non è un elenco di stringhe, il modo più semplice è passarci sopra e convertire ogni elemento in un nuovo elenco di stringhe:

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

O quando non sei ancora su Java 8:

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

O quando non sei ancora su Java 7:

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

Nota che dovresti dichiarare contro l'interfaccia ( java.util.Listin questo caso), non l'implementazione.


6
Mi piace il modo in cui i valori null vengono preservati in questa implementazione.

4
Se usi String.valueOf(object), non dovrai fare la object != null ? object.toString() : nullcosa
user219882

2
@Tomas: aggiungerebbe una stringa con valore "null"invece del letterale null. Dipende ulteriormente dai requisiti aziendali che sia desiderabile o meno. Per me, non sarebbe stato affatto accettabile in quanto introduce un bug potenzialmente importante.
BalusC

1
@Tomas: "null"non lo è nullaffatto. Il nullha un significato speciale in Java. Non ha senso essere costretti a farlo if (item.equals("null"))durante il controllo successivo.
BalusC

1
@Tomas: stai solo sconfiggendo la forte natura di digitazione di Java in questo modo. Ma come detto, dipende dai requisiti aziendali se ciò è desiderabile. Per me è semplicemente inaccettabile. Fai quello che vuoi e il tempo insegnerà :)
BalusC

18

Non è sicuro farlo!
Immagina se avessi:

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

Non avrebbe senso convertire l'elenco di quegli oggetti in qualsiasi tipo.


1
A meno che non abbiano il Object#toString()metodo ignorato. Tuttavia, l'intera conversione del tipo da X a String per scopi diversi dalla presentazione umana non ha davvero molto senso.
BalusC

13

Se vuoi farlo in modo sporco, prova questo.

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

Vantaggio: qui risparmi tempo non iterando su tutti gli oggetti.

Svantaggio: può produrre un buco nel piede.


12

Utilizzando 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";
    }
});

11

Usando Java 8 puoi fare:

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

10

È possibile utilizzare il carattere jolly per eseguire questa operazione come segue

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

8

Ecco un'altra alternativa che utilizza Guava

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

5

Il tuo codice ArrayList<String> list2 = (String)list;non viene compilato perché list2non è di tipo String. Ma non è l'unico problema.


0

Utilizzando 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 Prende un elenco di X e restituisce un elenco di T che estende o 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;
}

0

Una soluzione semplice:

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

Nota: funziona quando l'elenco contiene tutti gli elementi del tipo di dati String.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.