ArrayList <Object> öğesini ArrayList <String> 'e nasıl dönüştürebilirim?


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

Denedim:

ArrayList<String> list2 = (String)list; 

Ama bana bir derleme hatası verdi.


5
Neden bunu yapmak istiyorsun? Yani güvenli değil. Örneğe bir göz atın.
athspk

6
Dizge olmayanları listeye koyuyorsunuz. Onları dizge olmaya zorlarsanız ne olacağı konusunda beklentiniz nedir?
Ben Zotto

5
Şunu demek istediğinizi varsayıyorum: ArrayList <String> list2 = (ArrayList <String>) listesi;
Costi Ciudatu

Yanıtlar:


132

Bu aslında bir dizge listesi olmadığından, en kolay yol üzerinde döngü yapmak ve her öğeyi kendiniz yeni bir dizgi listesine dönüştürmektir:

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

Veya henüz Java 8 kullanmadığınızda:

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

Veya henüz Java 7 kullanmadığınızda:

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

java.util.ListUygulamaya değil ( bu durumda) arayüze karşı bildirimde bulunmanız gerektiğini unutmayın .


6
Bu uygulamada boş değerlerin korunmasını seviyorum.

4
Eğer kullanırsanız String.valueOf(object), yapmanız gerekmeyecek object != null ? object.toString() : nullşey
user219882

2
@Tomas: "null"değişmez değer yerine değer içeren bir dize ekler null. Bunun istenip istenmeyeceği iş gereksinimlerine de bağlıdır. Benim için, potansiyel olarak büyük bir hatayı ortaya çıkardığı için hiç kabul edilemezdi.
BalusC

1
@Tomas: "null"hiç nullde değil . nullJava özel bir anlamı vardır. Daha if (item.equals("null"))sonra bunu kontrol ederken yapmaya zorlanmanın bir anlamı yok .
BalusC

1
@Tomas: Bu şekilde yalnızca Java'nın güçlü yazım doğasını yeniyorsunuz. Ancak söylendiği gibi, bunun istenip istenmeyeceği iş gereksinimlerine bağlıdır. Benim için bu kesinlikle kabul edilemez. Ne istersen yap ve zaman öğretecek :)
BalusC

18

Bunu yapmak güvenli değil!
Şunlara sahip olduğunuzu hayal edin:

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

Bu Nesnelerin listesini herhangi bir türe dönüştürmek mantıklı olmaz.


1
Object#toString()Yöntemi geçersiz kılmadıkları sürece . Bununla birlikte, insan sunumundan başka amaçlar için X'ten String'e tüm tip dönüşümü gerçekten çok mantıklı değildir.
BalusC

13

Kirli bir şekilde yapmak istiyorsanız, bunu deneyin.

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

Avantaj: burada tüm nesneler üzerinde yineleme yapmayarak zamandan tasarruf edersiniz.

Dezavantaj: Ayağınızda delik oluşturabilir.


13

Java 8 kullanarak şunları yapabilirsiniz:

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

12

Guava kullanarak :

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

Bunu aşağıdaki gibi yapmak için joker karakter kullanabilirsiniz

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

8

İşte Guava kullanan başka bir alternatif

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

5

Kodunuz ArrayList<String> list2 = (String)list;çünkü derleme değil list2türde değil String. Ancak tek sorun bu değil.


0

Java 8 lambda kullanarak:

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

Java ile Generics X'in bir listesini alır ve X'i genişleten veya uygulayan bir T listesi döndürür, 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

Basit bir çözüm:

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

Not: Bu, liste veri türü String'in tüm öğelerini içerdiğinde çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.