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;
但是它给了我一个编译错误。
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;
但是它给了我一个编译错误。
因为这实际上不是一个字符串列表,最简单的方法是循环遍历它,并将每个项转换为一个新的字符串列表:
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.toList();
或者当你还没有使用 Java 16:
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
)而不是实现。
String.valueOf(object)
,你就不必进行 object != null ? object.toString() : null
这样的操作。 - user219882"null"
根本不是null
。在Java中,null
有着特殊的含义。在之后检查时被迫执行if (item.equals("null"))
毫无意义。 - BalusCArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
这样做是不安全的!
想象一下,如果你有:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
将那些对象列表转换成任何类型是没有意义的。
使用Java 8可以实现:
List<Object> list = ...;
List<String> strList = list.stream()
.map( Object::toString )
.collect( Collectors.toList() );
如果你想采用简单粗暴的方法,可以尝试这个。
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
优点:不必遍历所有对象,节省时间。
缺点:可能会在你的脚上留下一个洞。
使用 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";
}
});
这里有另一种使用Guava的替代方案。
List<Object> lst ...
List<String> ls = Lists.transform(lst, Functions.toStringFunction());
您的代码 ArrayList<String> list2 = (String)list;
无法编译,因为 list2
不是 String
类型。但这不是唯一的问题。
使用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)));
使用Java泛型,接受一个X类型的列表并返回一个T类型的列表,该T类型扩展或实现了X类型,太棒了!
// 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;
}