10 ответов:
так это на самом деле не список строк, самый простой способ-это перебрать его и преобразовать каждый элемент в новый список строк себя:
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"));не имеет смысла преобразовывать список этих объектов в любой тип.
С помощью гуавы:
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Не типаString. Но это не единственная проблема.
вот еще одна альтернатива с помощью гуавы
List<Object> lst ... List<String> ls = Lists.transform(lst, Functions.toStringFunction());
использование 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 Generics принимает список X и возвращает список T, который расширяет или реализует X, 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; }
Comments