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

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; 

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

由于这实际上不是一个string列表,最简单的方法是循环它并将每个项目转换成一个新的string列表:

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

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

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

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

使用番石榴 :

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

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

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

优点:在这里,通过不重复所有对象,节省时间。

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

使用Java 8你可以这样做:

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

你可以使用通配符来做到这一点如下

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

你的代码ArrayList<String> list2 = (String)list; 不会编译,因为list2不是Stringtypes的。 但这不是唯一的问题。

这是使用番石榴的另一种select

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

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

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