Bagaimana cara mengonversi ArrayList <Object> menjadi ArrayList <String>?

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

Saya mencoba:

ArrayList<String> list2 = (String)list; 

Tapi itu memberi saya kesalahan kompilasi.

rtf
sumber
5
Mengapa Anda ingin melakukan itu? Maksudku ini tidak aman. Lihat contohnya.
athspk
6
Anda memasukkan non-string ke dalam daftar. Apa ekspektasi Anda tentang apa yang terjadi jika Anda memaksa mereka menjadi string?
Ben Zotto
5
Saya berasumsi yang Anda maksud: ArrayList <String> list2 = (ArrayList <String>) list;
Costi Ciudatu

Jawaban:

131

Karena ini sebenarnya bukan daftar string, cara termudah adalah mengulanginya dan mengonversi sendiri setiap item menjadi daftar string baru:

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

Atau saat Anda belum menggunakan Java 8:

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

Atau saat Anda belum menggunakan Java 7:

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

Perhatikan bahwa Anda harus mendeklarasikan antarmuka ( java.util.Listdalam kasus ini), bukan implementasinya.

BalusC
sumber
6
Saya suka bagaimana nilai null dipertahankan dalam implementasi ini.
4
Jika Anda menggunakan String.valueOf(object), Anda tidak perlu melakukan object != null ? object.toString() : nullhal itu
user219882
2
@Tomas: itu akan menambahkan string dengan nilai "null"alih-alih literal null. Ini lebih tergantung pada kebutuhan bisnis apakah itu diinginkan atau tidak. Bagi saya, itu sama sekali tidak dapat diterima karena berpotensi menimbulkan bug besar.
BalusC
1
@Tomas: "null"tidak nullsama sekali. Itu nullmemiliki arti khusus di Jawa. Tidak masuk akal untuk dipaksa melakukannya if (item.equals("null"))saat memeriksa itu sesudahnya.
BalusC
1
@ Tomas: Anda hanya mengalahkan sifat mengetik yang kuat dari Java dengan cara ini. Tetapi seperti yang dikatakan, itu tergantung pada persyaratan bisnis apakah itu diinginkan. Bagi saya, itu tidak bisa diterima. Lakukan apa pun yang Anda inginkan dan waktu akan mengajar :)
BalusC
18

Tidak aman melakukan itu!
Bayangkan jika Anda memiliki:

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

Tidak masuk akal untuk mengubah daftar Objek tersebut menjadi tipe apa pun.

athspk
sumber
1
Kecuali mereka memiliki Object#toString()metode yang diganti. Namun, konversi tipe keseluruhan dari X ke String untuk tujuan lain selain presentasi manusia memang tidak masuk akal.
BalusC
13

Jika Anda ingin melakukannya dengan cara kotor, coba ini.

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

Keuntungan: di sini Anda menghemat waktu dengan tidak mengulang semua objek.

Kerugian: bisa menghasilkan lubang di kaki Anda.

Per Lindberg
sumber
12

Menggunakan jambu biji :

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
sumber
11

Menggunakan Java 8, Anda dapat melakukan:

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

Anda dapat menggunakan karakter pengganti untuk melakukan ini sebagai berikut

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

Berikut alternatif lain menggunakan Jambu Biji

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

Kode Anda ArrayList<String> list2 = (String)list;tidak dapat dikompilasi karena list2bukan tipe String. Tapi itu bukan satu-satunya masalah.

fastcodejava.dll
sumber
0

Menggunakan 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
sumber
0

Dengan Java Generics Membawa daftar X dan mengembalikan daftar T yang memperluas atau mengimplementasikan X, Manis!

    // 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;
}
Hanya aku
sumber
0

Solusi sederhana:

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

Catatan: ini berfungsi ketika daftar berisi semua elemen tipe data String.

S Krishna
sumber