2011-01-03 18 views
62
ArrayList<Object> list = new ArrayList<Object>(); 
list.add(1); 
list.add("Java"); 
list.add(3.14); 
System.out.println(list.toString()); 

Ich habe versucht:Wie kann ich ArrayList <Object> in ArrayList <String> konvertieren?

ArrayList<String> list2 = (String)list; 

Aber es gab mir einen Compiler-Fehler.

+5

Warum Sie das tun wollen? Ich meine es ist nicht sicher. Schauen Sie sich das Beispiel an. – athspk

+6

Sie fügen Nicht-Strings in die Liste ein. Was erwartest du, was passiert, wenn du sie zu Strings zwingst? –

+5

Ich nehme an, du meinst: ArrayList list2 = (ArrayList ) Liste; –

Antwort

85

Da dies tatsächlich nicht eine Liste von Strings, ist der einfachste Weg, über sie zu Schleife und konvertiert jedes Element in eine neue Liste von Strings selbst:

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

Oder, wenn Sie nicht auf Java 8 noch:

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

Oder, wenn Sie nicht auf Java 7 noch:

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

Beachten Sie, dass Sie die Schnittstelle (java.util.List in diesem Fall) deklarieren sollten, nicht die Implementierung.

+6

Ich mag, wie Null-Werte diese Implementierung beibehalten werden. –

+3

Wenn Sie 'String.valueOf (object)' verwenden, müssen Sie das 'object! = Null 'nicht ausführen. object.toString(): null' thing – user219882

+2

@Tomas: es würde eine Zeichenkette mit dem Wert '" null "' anstelle des Literals 'null' hinzufügen. Es hängt weiter von den Geschäftsanforderungen ab, ob das wünschenswert ist oder nicht. Für mich wäre es überhaupt nicht akzeptabel gewesen, da es einen möglicherweise großen Fehler einführt. – BalusC

16

Es ist nicht sicher, das zu tun!
Stellen Sie sich vor, wenn Sie hatte:

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

Es würde keinen Sinn machen, die Liste dieser Objekte auf jede Art zu konvertieren.

+1

Es sei denn, sie haben ['Object # toString()'] (http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#toString%28% 29) Methode überschrieben. Die ganze Typumwandlung von X zu String für andere Zwecke als die menschliche Präsentation macht jedoch keinen Sinn. – BalusC

4

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

11

guava Verwendung:

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

Hier ist eine andere Alternative ist mit Guava

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

Wenn Sie es die schmutzige Art und Weise tun wollen, versuchen Sie dies.

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

Vorteil: Hier sparen Sie Zeit, indem Sie nicht über alle Objekte iterieren.

Nachteil: kann ein Loch in Ihrem Fuß erzeugen.

6

mit Java 8 Sie tun können:

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

mit 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, die oder Geräte X erstreckt, Süss!

// 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; 
} 
6

Sie können Platzhalter verwenden, um dies zu tun, wie folgende

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