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.

RTF
quelle
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.

BalusC
quelle
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.

athspk
quelle
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.

Per Lindberg
quelle
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";
    }
});
Emil
quelle
11

Mit Java 8 können Sie Folgendes tun:

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

Sie können dazu einen Platzhalter verwenden

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

Hier ist eine weitere Alternative mit Guava

List<Object> lst ...    
List<String> ls = Lists.transform(lst, Functions.toStringFunction());
husayt
quelle
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.

fastcodejava
quelle
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)));
Ankush Soni
quelle
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;
}
Nur ich
quelle
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.

S Krishna
quelle