2011-01-03 46 views
62
ArrayList<Object> list = new ArrayList<Object>(); 
list.add(1); 
list.add("Java"); 
list.add(3.14); 
System.out.println(list.toString()); 

tôi đã cố gắng:Làm cách nào để chuyển đổi ArrayList <Object> thành ArrayList <String>?

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ụ. – athspk

+6

Bạn đang đặt không dây vào danh sách. Kỳ vọng của bạn về những gì sẽ xảy ra nếu bạn buộc họ phải là dây? –

+5

Tôi giả sử bạn có nghĩa là: Danh sách ArrayList list2 = (ArrayList ); –

Trả lời

85

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

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

Hoặc khi bạn vắng mặt trên Java 8 nào:

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

Hoặc khi bạn vắng mặt trên Java 7 nào:

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

Lưu ý rằng bạn nên tuyên bố chống lại giao diện (java.util.List trong trường hợp này), không phải thực hiện.

+6

Tôi thích cách các giá trị null được bảo tồn trong quá trình thực hiện này. –

+3

Nếu bạn sử dụng 'String.valueOf (đối tượng)', bạn sẽ không phải thực hiện 'đối tượng! = Null? object.toString(): null' Điều – user219882

+2

@Tomas: nó sẽ thêm một chuỗi có giá trị '" null "' thay cho chữ 'null'. Nó phụ thuộc nhiều hơn vào các yêu cầu kinh doanh cho dù đó là mong muốn hay không. Đối với tôi, nó sẽ không được chấp nhận ở tất cả vì nó giới thiệu một lỗi có khả năng lớn. – BalusC

16

Không an toàn để 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")); 

Nó sẽ không có ý nghĩa để chuyển đổi danh sách những đối tượng cho bất kỳ loại.

+1

Trừ khi họ có ['Object # toString()'] (http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#toString%28% 29) phương pháp ghi đè. Tuy nhiên, toàn bộ loại chuyển đổi từ X thành String cho các mục đích khác so với trình bày của con người thực sự không có ý nghĩa nhiều. – BalusC

4

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

11

Sử dụng guava:

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

Dưới đây là một thay thế sử dụng Guava

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

Nếu bạn muốn làm điều đó một cách bẩn thỉu, hãy thử 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 lỗ trên bàn chân của bạn.

6

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

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 Mất một danh sách của X và trả về một danh sách các T kéo dài hoặc dụng cụ X, Ngọt!

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

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

ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list); 
Các vấn đề liên quan