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
왜 그렇게 하시겠습니까? 안전하지 않다는 뜻입니다. 예를보십시오.
athspk 2011 년

6
목록에 비 문자열을 넣습니다. 강제로 문자열로 만들면 어떻게 될지에 대한 기대는 무엇입니까?
Ben Zotto 2011 년

5
나는 당신이 의미한다고 가정합니다 : ArrayList <String> list2 = (ArrayList <String>) list;
Costi Ciudatu 2011 년

답변:


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
이 구현에서 null 값이 유지되는 방식이 마음에 듭니다.

4
당신이 사용하는 경우 String.valueOf(object), 당신은 할 필요가 없습니다 object != null ? object.toString() : null
user219882

2
@Tomas : "null"리터럴 대신 값이있는 문자열을 추가합니다 null. 그것이 바람직한 지 여부에 관계없이 비즈니스 보답에 더 달려 있습니다. 나에게는 잠재적으로 중대한 버그를 유발하므로 전혀 수용 할 수 없었을 것입니다.
BalusC 2011

1
@Tomas : "null"전혀 아닙니다 null. 는 null자바에서 특별한 의미를 갖습니다. if (item.equals("null"))나중에 그것을 확인할 때 강제로 수행하는 것은 의미가 없습니다 .
BalusC 2011

1
@Tomas : 이런 식으로 Java의 강력한 타이핑 특성을 물리 치고 있습니다. 그러나 말했듯이 그것이 바람직한 지 여부는 비즈니스 요구 사항에 따라 다릅니다. 저에게 그것은 단순히 용납 할 수없는 일입니다. 원하는대로하면 시간이 가르쳐 줄 것입니다. :)
BalusC

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에서 문자열로의 전체 유형 변환은 실제로 그다지 의미가 없습니다.
BalusC 2011 년

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

Guava를 사용하는 또 다른 대안이 있습니다.

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

5

유형이 아니기 ArrayList<String> list2 = (String)list;때문에 코드 가 컴파일되지 않습니다 . 그러나 이것이 유일한 문제는 아닙니다.list2String


0

Java 8 람다 사용 :

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

With 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;
}

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 데이터 유형의 모든 요소가 포함되어있을 때 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.