ฉันจะแปลง ArrayList <Object> เป็น ArrayList <String> ได้อย่างไร


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

แต่มันทำให้ฉันมีข้อผิดพลาดในการคอมไพล์


5
ทำไมคุณถึงต้องการทำเช่นนั้น? ฉันหมายความว่ามันไม่ปลอดภัย ดูตัวอย่าง
athspk

6
คุณกำลังใส่สิ่งที่ไม่ใช่สตริงลงในรายการ คุณคาดหวังว่าจะเกิดอะไรขึ้นถ้าคุณบังคับให้เป็นสตริง?
Ben Zotto

5
ฉันคิดว่าคุณหมายถึง: ArrayList <String> list2 = (ArrayList <String>) รายการ;
Costi Ciudatu

คำตอบ:


133

ตั้งแต่นี้เป็นจริงไม่ได้เป็นรายการของสตริงเป็นวิธีที่ง่ายที่สุดคือการห่วงมากกว่านั้นและแปลงแต่ละรายการเป็นรายการใหม่ของสตริงตัวเอง

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ในกรณีนี้) ไม่ใช่การใช้งาน


6
ฉันชอบวิธีการรักษาค่าว่างของการใช้งานนี้

4
หากคุณใช้String.valueOf(object)คุณจะไม่ต้องทำobject != null ? object.toString() : nullสิ่งนั้น
user219882

2
@Tomas: มันจะเพิ่มสตริงที่มีค่าแทนการที่แท้จริง"null" nullขึ้นอยู่กับข้อกำหนดทางธุรกิจเพิ่มเติมว่าเป็นที่ต้องการหรือไม่ สำหรับฉันมันคงไม่เป็นที่ยอมรับเลยเพราะมันแนะนำจุดบกพร่องที่สำคัญที่อาจเกิดขึ้น
BalusC

1
@ โทมัส: "null"ไม่nullเลย nullมีพิเศษความหมายใน Java ไม่มีเหตุผลที่จะถูกบังคับให้ทำif (item.equals("null"))เมื่อตรวจสอบหลังจากนั้น
BalusC

1
@ โทมัส: คุณเอาชนะลักษณะการพิมพ์ที่แข็งแกร่งของ Java ด้วยวิธีนี้เท่านั้น แต่อย่างที่กล่าวไปว่ามันขึ้นอยู่กับความต้องการทางธุรกิจว่าเป็นที่ต้องการหรือไม่ สำหรับฉันมันเป็นเรื่องที่ยอมรับไม่ได้ ทำสิ่งที่คุณต้องการและเวลาจะสอน :)
BalusC

18

ไม่ปลอดภัยที่จะทำเช่นนั้น!
ลองนึกดูว่าคุณมี:

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

มันไม่สมเหตุสมผลที่จะแปลงรายการวัตถุเหล่านั้นเป็นประเภทใด ๆ


1
เว้นแต่จะมีObject#toString()การลบล้างวิธีการ อย่างไรก็ตามการแปลงประเภททั้งหมดจาก X เป็น String เพื่อจุดประสงค์อื่นนอกเหนือจากการนำเสนอของมนุษย์นั้นไม่สมเหตุสมผลมากนัก
BalusC

13

ถ้าคุณอยากทำแบบสกปรกลองทำตามนี้

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

ข้อได้เปรียบ: ที่นี่คุณประหยัดเวลาโดยไม่ต้องวนซ้ำวัตถุทั้งหมด

ข้อเสีย: อาจทำให้เท้าเป็นรู


13

การใช้ Java 8 คุณสามารถทำได้:

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


12

คุณสามารถใช้สัญลักษณ์แทนเพื่อดำเนินการดังต่อไปนี้

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

8

นี่เป็นอีกทางเลือกหนึ่งโดยใช้Guava

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

5

รหัสของคุณArrayList<String> list2 = (String)list;ไม่ได้รวบรวมเพราะไม่ได้เป็นประเภทlist2 Stringแต่นั่นไม่ใช่ปัญหาเดียว



0

ด้วย 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;
}

0

วิธีง่ายๆ:

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

หมายเหตุ: สิ่งนี้ใช้ได้เมื่อรายการมีองค์ประกอบทั้งหมดของสตริงประเภทข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.