Làm cách nào để chuyển đổi ArrayList <Object> thành ArrayList <String>?


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

Tôi đã thử:

ArrayList<String> list2 = (String)list; 

Nhưng nó đã cho tôi một lỗi biên dịch.


5
Tại sao bạn muốn làm điều đó? Ý tôi là nó không an toàn. Hãy xem ví dụ.
sportsspk

6
Bạn đang đặt các chuỗi không phải vào danh sách. Kỳ vọng của bạn về điều gì sẽ xảy ra nếu bạn buộc chúng phải là chuỗi?
Ben Zotto

5
Tôi giả sử ý của bạn là: ArrayList <Chuỗi> list2 = (ArrayList <Chuỗi>) danh sách;
Costi Ciudatu

Câu trả lời:


130

Vì đây thực sự không phải là danh sách các chuỗi, cách dễ nhất là lặp lại nó và tự chuyển đổi từng mục thành một danh sách chuỗi mới:

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

Hoặc khi bạn chưa sử dụng Java 8:

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

Hoặc khi bạn chưa sử dụng Java 7:

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

Lưu ý rằng bạn nên khai báo với giao diện ( java.util.Listtrong trường hợp này), chứ không phải việc triển khai.


6
Tôi thích cách các giá trị null được bảo toàn trong việc triển khai này.

4
Nếu bạn sử dụng String.valueOf(object), bạn sẽ không phải làm những object != null ? object.toString() : nullđiều
user219882

2
@Tomas: nó sẽ thêm một chuỗi với giá trị "null"thay vì chữ null. Nó phụ thuộc thêm vào các điều kiện kinh doanh cho dù đó là mong muốn hay không. Đối với tôi, nó sẽ không thể chấp nhận được chút nào vì nó giới thiệu một lỗi lớn tiềm ẩn.
BalusC

1
@Tomas: "null"không hề null. Có nullmột ý nghĩa đặc biệt trong Java. Không có ý nghĩa gì nếu bạn buộc phải làm if (item.equals("null"))khi kiểm tra điều đó sau đó.
BalusC

1
@Tomas: bạn chỉ đánh bại tính chất gõ mạnh của Java theo cách này. Nhưng như đã nói, nó phụ thuộc vào yêu cầu kinh doanh cho dù đó là mong muốn. Đối với tôi, điều đó đơn giản là không thể chấp nhận được. Hãy làm những gì bạn muốn và thời gian sẽ dạy :)
BalusC

18

Thật không an toàn khi làm điều đó!
Hãy tưởng tượng nếu bạn có:

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

Sẽ không có ý nghĩa nếu chuyển đổi danh sách các Đối tượng đó thành bất kỳ loại nào.


1
Trừ khi họ có Object#toString()ghi đè phương thức. Tuy nhiên, việc chuyển đổi toàn bộ kiểu từ X sang Chuỗi cho các mục đích khác ngoài việc trình bày của con người thực sự không có nhiều ý nghĩa.
BalusC

13

Nếu bạn muốn làm theo cách bẩn thỉu, hãy thử cách này.

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

Ưu điểm: ở đây bạn tiết kiệm thời gian bằng cách không lặp lại trên tất cả các đối tượng.

Bất lợi: có thể tạo ra một lỗ trên bàn chân của bạn.


12

Sử dụng ổi :

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

Sử dụng Java 8 bạn có thể làm:

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

10

Bạn có thể sử dụng ký tự đại diện để thực hiện việc này như sau

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

8

Đây là một giải pháp thay thế khác bằng Guava

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

5

Mã của bạn ArrayList<String> list2 = (String)list;không biên dịch vì list2không thuộc loại String. Nhưng đó không phải là vấn đề duy nhất.


0

Sử dụng 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

Với Java Generics Lấy danh sách X và trả về danh sách T mở rộng hoặc triển khai 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

Một giải pháp đơn giản:

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

Lưu ý: điều này hoạt động khi danh sách chứa tất cả các phần tử của chuỗi kiểu dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.