如何将ArrayList <object>转换为ArrayList <string>?</string> </object>

时间:2011-01-03 00:58:32

标签: java arraylist

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; 

但它给了我一个编译错误。

11 个答案:

答案 0 :(得分:108)

由于实际不是字符串列表,最简单的方法是循环遍历它并自己将每个项目转换为新的字符串列表:

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),而不是实现。

答案 1 :(得分:17)

这样做是不安全的!
想象一下,如果你有:

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

将这些对象的列表转换为任何类型是没有意义的。

答案 2 :(得分:13)

如果你想以肮脏的方式去做,试试这个。

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

优势:在这里,您可以通过不迭代所有对象来节省时间。

缺点:可能会在你的脚上产生一个洞。

答案 3 :(得分:12)

使用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 :(得分:9)

您可以使用通配符执行以下操作

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

答案 5 :(得分:7)

使用Java 8,您可以:

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

答案 6 :(得分:6)

以下是使用Guava

的另一种选择
List<Object> lst ...    
List<String> ls = Lists.transform(lst, Functions.toStringFunction());

答案 7 :(得分:5)

您的代码ArrayList<String> list2 = (String)list;无法编译,因为list2不属于String类型。但这不是唯一的问题。

答案 8 :(得分:0)

使用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)));

答案 9 :(得分:0)

使用Java Generics获取X的列表并返回扩展或实现X的T列表,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;
}

答案 10 :(得分: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());
    }

注意:当列表包含数据类型为String的所有元素时,此方法有效。