ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
ฉันเหนื่อย:
ArrayList<String> list2 = (String)list;
แต่มันทำให้ฉันมีข้อผิดพลาดในการคอมไพล์
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
ฉันเหนื่อย:
ArrayList<String> list2 = (String)list;
แต่มันทำให้ฉันมีข้อผิดพลาดในการคอมไพล์
คำตอบ:
ตั้งแต่นี้เป็นจริงไม่ได้เป็นรายการของสตริงเป็นวิธีที่ง่ายที่สุดคือการห่วงมากกว่านั้นและแปลงแต่ละรายการเป็นรายการใหม่ของสตริงตัวเอง
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
หรือเมื่อคุณยังไม่ได้ใช้ Java 8:
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(Objects.toString(object, null));
}
หรือเมื่อคุณยังไม่ได้ใช้ Java 7:
List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
strings.add(object != null ? object.toString() : null);
}
โปรดทราบว่าคุณควรประกาศต่อต้านอินเทอร์เฟซ ( java.util.List
ในกรณีนี้) ไม่ใช่การใช้งาน
String.valueOf(object)
คุณจะไม่ต้องทำobject != null ? object.toString() : null
สิ่งนั้น
"null"
null
ขึ้นอยู่กับข้อกำหนดทางธุรกิจเพิ่มเติมว่าเป็นที่ต้องการหรือไม่ สำหรับฉันมันคงไม่เป็นที่ยอมรับเลยเพราะมันแนะนำจุดบกพร่องที่สำคัญที่อาจเกิดขึ้น
"null"
ไม่null
เลย null
มีพิเศษความหมายใน Java ไม่มีเหตุผลที่จะถูกบังคับให้ทำif (item.equals("null"))
เมื่อตรวจสอบหลังจากนั้น
ไม่ปลอดภัยที่จะทำเช่นนั้น!
ลองนึกดูว่าคุณมี:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
มันไม่สมเหตุสมผลที่จะแปลงรายการวัตถุเหล่านั้นเป็นประเภทใด ๆ
Object#toString()
การลบล้างวิธีการ อย่างไรก็ตามการแปลงประเภททั้งหมดจาก X เป็น String เพื่อจุดประสงค์อื่นนอกเหนือจากการนำเสนอของมนุษย์นั้นไม่สมเหตุสมผลมากนัก
ถ้าคุณอยากทำแบบสกปรกลองทำตามนี้
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
ข้อได้เปรียบ: ที่นี่คุณประหยัดเวลาโดยไม่ต้องวนซ้ำวัตถุทั้งหมด
ข้อเสีย: อาจทำให้เท้าเป็นรู
การใช้ Java 8 คุณสามารถทำได้:
List<Object> list = ...;
List<String> strList = list.stream()
.map( Object::toString )
.collect( Collectors.toList() );
ใช้ฝรั่ง :
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";
}
});
คุณสามารถใช้สัญลักษณ์แทนเพื่อดำเนินการดังต่อไปนี้
ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
นี่เป็นอีกทางเลือกหนึ่งโดยใช้Guava
List<Object> lst ...
List<String> ls = Lists.transform(lst, Functions.toStringFunction());
รหัสของคุณArrayList<String> list2 = (String)list;
ไม่ได้รวบรวมเพราะไม่ได้เป็นประเภทlist2
String
แต่นั่นไม่ใช่ปัญหาเดียว
ใช้ 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)));
ด้วย Java Generics รับรายการ X และส่งคืนรายการ T ที่ขยายหรือใช้ X, 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;
}
วิธีง่ายๆ:
List<Object> lst =listOfTypeObject;
ArrayList<String> aryLst = new ArrayList<String>();
for (int i = 0; i < lst.size(); i++) {
aryLst.add(lst.get(i).toString());
}
หมายเหตุ: สิ่งนี้ใช้ได้เมื่อรายการมีองค์ประกอบทั้งหมดของสตริงประเภทข้อมูล