Как я могу конвертировать ArrayList <Object>в ArrayList <String>? - PullRequest
82 голосов
/ 03 января 2011
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; 

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

Ответы [ 10 ]

111 голосов
/ 03 января 2011

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

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 в данном случае), а не реализацию.

17 голосов
/ 03 января 2011

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

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

Не имеет смысла преобразовывать список этих Объектов в любой тип.

13 голосов
/ 21 мая 2014

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

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

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

Недостаток: может образовать дыру в ноге.

12 голосов
/ 03 января 2011

Использование гуавы :

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";
    }
});
9 голосов
/ 05 июля 2016

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

ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
8 голосов
/ 17 августа 2015

Используя Java 8, вы можете:

List<Object> list = ...;
List<String> strList = list.stream()
                           .map( Object::toString )
                           .collect( Collectors.toList() );
6 голосов
/ 17 июля 2013

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

List<Object> lst ...    
List<String> ls = Lists.transform(lst, Functions.toStringFunction());
5 голосов
/ 03 января 2011

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

0 голосов
/ 01 декабря 2015

С 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 голосов
/ 06 октября 2015

Использование 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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...