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.


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.


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.


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.


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

11

Menggunakan Java 8, Anda dapat melakukan:

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

10

Anda dapat menggunakan karakter pengganti untuk melakukan ini sebagai berikut

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

8

Berikut alternatif lain menggunakan Jambu Biji

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

5

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


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)));

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.