Wie kann ich ArrayList <Objekt> in ArrayList <String> konvertieren?


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

Ich habe es versucht:

ArrayList<String> list2 = (String)list; 

Aber es gab mir einen Kompilierungsfehler.


5
Warum willst du das machen? Ich meine, es ist nicht sicher. Schauen Sie sich das Beispiel an.
Athspk

6
Sie fügen Nicht-Strings in die Liste ein. Was erwarten Sie von dem, was passiert, wenn Sie sie zu Strings zwingen?
Ben Zotto

5
Ich nehme an, Sie meinten: ArrayList <String> list2 = (ArrayList <String>) list;
Costi Ciudatu

Antworten:


130

Da es sich eigentlich nicht um eine Liste von Zeichenfolgen handelt, können Sie diese am einfachsten durchlaufen und jedes Element selbst in eine neue Liste von Zeichenfolgen konvertieren:

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

Oder wenn Sie noch nicht mit Java 8 arbeiten:

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

Oder wenn Sie noch nicht mit Java 7 arbeiten:

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

Beachten Sie, dass Sie sich gegen die Schnittstelle ( java.util.Listin diesem Fall) und nicht gegen die Implementierung aussprechen sollten.


6
Mir gefällt, wie Nullwerte bei dieser Implementierung erhalten bleiben.

4
Wenn Sie verwenden String.valueOf(object), müssen Sie das object != null ? object.toString() : nullDing nicht tun
user219882

2
@Tomas: Es würde eine Zeichenfolge mit Wert "null"anstelle des Literal hinzugefügt null. Es hängt weiter von den Geschäftsanforderungen ab, ob dies wünschenswert ist oder nicht. Für mich wäre es überhaupt nicht akzeptabel gewesen, da es einen potenziell schwerwiegenden Fehler verursacht.
BalusC

1
@Tomas: "null"ist überhaupt nicht null. Das nullhat in Java eine besondere Bedeutung. Es macht keinen Sinn, gezwungen zu sein, dies zu if (item.equals("null"))überprüfen.
BalusC

1
@Tomas: Sie besiegen nur die starke Typisierung von Java auf diese Weise. Aber wie gesagt, es hängt von den Geschäftsanforderungen ab, ob dies wünschenswert ist. Für mich ist das einfach inakzeptabel. Tun Sie, was Sie wollen und die Zeit wird lehren :)
BalusC

18

Das ist nicht sicher!
Stellen Sie sich vor, Sie hätten:

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

Es wäre nicht sinnvoll, die Liste dieser Objekte in einen beliebigen Typ zu konvertieren.


1
Es sei denn, sie haben die Object#toString()Methode überschrieben. Die gesamte Typkonvertierung von X in String für andere Zwecke als die menschliche Darstellung ist jedoch in der Tat nicht sehr sinnvoll.
BalusC

13

Wenn Sie es auf schmutzige Weise tun möchten, versuchen Sie dies.

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

Vorteil: Hier sparen Sie Zeit, indem Sie nicht alle Objekte durchlaufen.

Nachteil: Kann ein Loch in Ihrem Fuß erzeugen.


12

Mit Guave :

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

Mit Java 8 können Sie Folgendes tun:

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

10

Sie können dazu einen Platzhalter verwenden

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

8

Hier ist eine weitere Alternative mit Guava

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

5

Ihr Code ArrayList<String> list2 = (String)list;wird nicht kompiliert, da er list2nicht vom Typ ist String. Das ist aber nicht das einzige Problem.


0

Verwenden von 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

Mit Java Generics Nimmt eine Liste von X und gibt eine Liste von T zurück, die X erweitert oder implementiert, 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

Eine einfache Lösung:

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

Hinweis: Dies funktioniert, wenn die Liste alle Elemente des Datentyps String enthält.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.