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.
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.
Jawaban:
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.List
dalam kasus ini), bukan implementasinya.
String.valueOf(object)
, Anda tidak perlu melakukan object != null ? object.toString() : null
hal itu
"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.
"null"
tidak null
sama sekali. Itu null
memiliki arti khusus di Jawa. Tidak masuk akal untuk dipaksa melakukannya if (item.equals("null"))
saat memeriksa itu sesudahnya.
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.
Object#toString()
metode yang diganti. Namun, konversi tipe keseluruhan dari X ke String untuk tujuan lain selain presentasi manusia memang tidak masuk akal.
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.
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";
}
});
Anda dapat menggunakan karakter pengganti untuk melakukan ini sebagai berikut
ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Berikut alternatif lain menggunakan Jambu Biji
List<Object> lst ...
List<String> ls = Lists.transform(lst, Functions.toStringFunction());
Kode Anda ArrayList<String> list2 = (String)list;
tidak dapat dikompilasi karena list2
bukan tipe String
. Tapi itu bukan satu-satunya masalah.
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)));
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;
}