如何将ArrayList <Object>转换为ArrayList <String>?


94
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; 

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


5
你为什么要这么做?我的意思是不安全。看这个例子。
2011年

6
您正在将非字符串放入列表。您对将其强制为字符串会发生什么期望?
Ben Zotto

5
我假设你的意思是:ArrayList <String> list2 =(ArrayList <String>)list;
Costi Ciudatu 2011年

Answers:


130

由于这实际上不是字符串列表,所以最简单的方法是遍历它,然后将每个项目自己转换为新的字符串列表:

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

请注意,您应该声明接口(java.util.List在这种情况下),而不是实现。


6
我喜欢在此实现中如何保留空值。

4
如果您使用String.valueOf(object),则无需做任何object != null ? object.toString() : null事情
user219882 2012年

2
@Tomas:它将添加一个带有值的字符串,"null"而不是文字null。是否满足要求还取决于业务需求。对我来说,这根本不会被接受,因为它会引入潜在的重大错误。
BalusC

1
@Tomas:"null"一点也不null。在null具有Java中的特殊含义。if (item.equals("null"))事后检查时被迫去做是没有意义的。
BalusC

1
@Tomas:您只是用这种方式击败了Java强大的输入特性。但是如上所述,这是否取决于业务需求。对我来说,这简直是无法接受的。做任何您想做的事,时间就会教:)
BalusC 2012年

18

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

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()方法被重写。但是,出于除人类表示之外的其他目的,从X到String的整个类型转换确实没有多大意义。
BalusC

13

如果您想以肮脏的方式进行操作,请尝试此操作。

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

优点:在这里,您无需遍历所有对象,从而节省了时间。

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


12

使用番石榴

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

使用Java 8,您可以执行以下操作:

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

10

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

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

8

这是使用番石榴的另一种选择

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

5

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


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

0

Java泛型函数使用X列表并返回扩展或实现X的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;
}

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的所有元素时,此方法有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.