web-dev-qa-db-fra.com

Comment puis-je convertir ArrayList <Object> en ArrayList <String>?

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

J'ai essayé:

ArrayList<String> list2 = (String)list; 

Mais cela m'a donné une erreur de compilation.

84
rtf

Comme il s’agit en réalité et non d'une liste de chaînes, le moyen le plus simple consiste à le parcourir en boucle et à convertir chaque élément en une nouvelle liste de chaînes:

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

Ou quand vous n'êtes pas sur Java 8 encore:

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

Ou quand vous n'êtes pas sur Java 7:

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

Notez que vous devriez déclarer contre l’interface ( Java.util.List dans ce cas), pas la mise en œuvre.

113
BalusC

Ce n'est pas sécuritaire de faire ça!
Imaginez si vous aviez:

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

Cela n'aurait aucun sens de convertir la liste de ces objets en n'importe quel type.

17
athspk

Si vous voulez le faire de manière sale, essayez ceci.

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

Avantage: vous gagnez du temps en ne parcourant pas tous les objets.

Inconvénient: peut produire un trou dans votre pied.

13
Per Lindberg

Utilisation de goyave :

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

Vous pouvez utiliser un caractère générique pour le faire comme suit

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

En utilisant Java 8, vous pouvez faire:

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

Voici une autre alternative utilisant Guava

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

Votre code ArrayList<String> list2 = (String)list; ne compile pas car list2 n'est pas de type String. Mais ce n'est pas le seul problème.

5
fastcodejava

Une solution simple:

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

Remarque: cela fonctionne lorsque la liste contient tous les éléments du type de données String.

0
S Krishna

Utilisation 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
Ankush soni

With Java Generics Prend une liste de X et renvoie une liste de T qui étend ou implémente 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
Just Me