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

Я пробовал:Как преобразовать ArrayList <Object> в ArrayList <String>?

ArrayList<String> list2 = (String)list; 

Но он дал мне ошибку компиляции.

+5

Почему вы хотите сделать это? Я имею в виду, что это не безопасно. Взгляните на пример. – athspk

+6

Вы помещаете в строку не строки. Каково ваше ожидание того, что произойдет, если вы заставите их быть струнами? –

+5

Я предполагаю, что вы имели в виду: ArrayList list2 = (ArrayList ); –

ответ

85

Поскольку это фактически не список строк, самый простой способ заключается в петлю над ним и преобразовать каждый элемент в новый список строк сам:

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<>(list.size()); 
for (Object object : list) { 
    strings.add(object != null ? object.toString() : null); 
} 

Обратите внимание, что вы должны декларировать против интерфейса (java.util.List в этом случае), а не реализацию.

+6

Мне нравится, как нулевые значения сохраняются в этой реализации. –

+3

Если вы используете 'String.valueOf (object)', вам не нужно будет делать 'object! = Null? object.toString(): null_ thing – user219882

+2

@Tomas: он добавил бы строку со значением '" null "' вместо буквенного 'null'. Это зависит в дальнейшем от деловых требований, желательных или нет. Для меня это было бы неприемлемо, поскольку оно вводит потенциально серьезную ошибку. – BalusC

16

Это небезопасно!
Представьте себе, если у вас:

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()'] (http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#toString%28% 29) метод переопределен. Однако преобразование всего типа из X в String для других целей, нежели представление человека, действительно не имеет большого смысла. – BalusC

4

Ваш код ArrayList<String> list2 = (String)list; не компилируется, потому что list2 не относится к типу String. Но это не единственная проблема.

11

Использование 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

Вот еще одна альтернатива, используя Guava

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

Если вы хотите сделать это грязный путь, попробуйте это.

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

Преимущество: здесь вы экономите время, не повторяя все объекты.

Недостаток: может образовать отверстие в вашей ноге.

6

Использование Java 8 вы можете сделать:

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

Использование Java 8 лямбда:

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

С Java дженериков принимает список X и возвращает список T, который расширяет или реализует X, Милая!

// 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

Вы можете использовать подстановочные знаки, чтобы сделать это следующим образом

ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list); 
Смежные вопросы