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

rtf*_*rtf 88 java arraylist

ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Run Code Online (Sandbox Code Playgroud)

我试过了:

ArrayList<String> list2 = (String)list; 
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 119

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

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

或者当你还没有使用Java 8时:

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

或者当你还没有使用Java 7时:

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

请注意,您应该声明接口(java.util.List在本例中),而不是实现.

  • 我喜欢这个实现如何保留null值. (6认同)
  • 如果使用`String.valueOf(object)`,则不必执行`object!= null?object.toString():null`的事情 (4认同)
  • @Tomas:它会添加一个值为"null"的字符串,而不是文字"null".这进一步取决于业务需求是否是可取的.对我来说,它根本不可接受,因为它引入了一个潜在的主要错误. (2认同)
  • @Tomas:你只是通过这种方式打败了 Java 的强类型特性。但如前所述,这取决于业务需求是否可取。对我来说,这简直不能接受。做任何你想做的事,时间会教你:) (2认同)

ath*_*spk 17

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

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

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


Per*_*erg 13

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

@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
   return (ArrayList) a;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Emi*_*mil 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";
    }
});
Run Code Online (Sandbox Code Playgroud)


hel*_*ker 9

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

ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Run Code Online (Sandbox Code Playgroud)


Sca*_*dge 8

使用Java 8,您可以:

List<Object> list = ...;
List<String> strList = list.stream()
                           .map( Object::toString )
                           .collect( Collectors.toList() );
Run Code Online (Sandbox Code Playgroud)


hus*_*ayt 6

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

List<Object> lst ...    
List<String> ls = Lists.transform(lst, Functions.toStringFunction());
Run Code Online (Sandbox Code Playgroud)


fas*_*ava 5

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