2010-11-26 4 views
30

List<String>List<Object>으로 변환하고 싶습니다.목록을 변환하는 방법 <String> 목록으로 <Object>

기존 방법 중 하나가 List<String>을 반환하고이를 List<Object>으로 변환하고 싶습니다. Java에서 요소를 반복하고 변환하는 다른 방법이 있습니까?

+4

'문자열'은 왜 객체입니까? – khachik

+4

'List ' –

+8

정확히 기대하고있는 함수에리스트를 전달해야 할 수도 있습니다. 형식 지움으로 인해 목록 은 목록 입니다. List 을 가지고있는 메소드가 있다면 그 메소드는 List 를 확장합니다.해당 방법을 통제하지 못하는 경우 아래 답변을 따르십시오. –

답변

57

새로운 ArrayList<Object>의 생성자에 매개 변수로 List<String>을 통과 많은 코드를 작성할 필요가 없습니다. StringObject 연장 임의 Collection

List<Object> objectList = new ArrayList<Object>(stringList); 

는만큼의 종류가 ArrayList 유형 확장으로 생성자 인수로 전달 될 수있다. 생성자는 Collection이지만, List은 의 하위 인터페이스이므로 List<String> 만 사용할 수 있습니다.

+1

이것은 불필요한 객체를 구성하며 큰 목록 인 경우 잠재적으로 많은 메모리를 차지할 수 있습니다. 그냥 던져. –

+0

답변에 대한 의견을 읽어보십시오. 그것을 주조하는 것은 잘못된 해결책입니다. 이 답변은 다운 보트를받을 가치가 없습니다. –

+0

예. 나는 downvote를 제거 할 것이다 (6 분 또는 그것을 말한다) 말한다. 하지만 내 것도 가치가 없습니다. –

3

이 꽤 비효율적이지만, 적어도 당신은 ~

List<String> stringList = new ArrayList<String>(); 
List<Object> objectList = Arrays.asList(stringList.toArray()); 
+0

Tks. 나는 이것이 새로운 ArrayList를 메모리에 만들지 않을 것이라고 생각한다. 원래의 stringList를 List 으로 변환하면된다. – Alexs

+0

@Alex 새로운 ArrayList를 만들지는 않지만 내부적으로 수정할 수없는 private List 구현을 만듭니다.이 구현은 ArrayList와 매우 유사합니다. 효과는 매우 비슷하지만 새 요소를 해당 목록에 추가해야하는 경우 문제가 발생합니다. 게다가, 저장하고 있다고 생각하는 메모리는'stringList.toArray()'이후에 새로운 배열을 만드는 데 사용됩니다. 그 다음에 새로운 할당 배열이 생성됩니다. – OscarRyz

13

모든 Java 컬렉션은 문자열 또는 기타 객체 컬렉션입니다. 형식 인수는 단지 설탕입니다. 매우 큰 목록을 처리하는 것과 같은 상황에 따라 변환하기를 원할 수 있습니다. 동일한 목록에서 서로 다른 두 가지 유형의 개체를 혼합하는 위험이 있습니다.

List<Object> objectList = (List)stringList; 

그리고 악성 콘텐츠를 제거 할 수있는 @SuppressWarning을 넣어 ...

+2

-1이 방법을 사용하는 것은 좋지 않습니다. –

+3

정말 그렇지 않습니다. 이미 필요한 것을 얻을 때 새로운 컬렉션을 만드는 이유는 무엇입니까? 합리적이고 효율적입니다. –

+5

그러면 동일한 객체에 대한 두 개의 참조가 생깁니다. 하나의 참조는 그것이'List '이고 다른 하나는 그것이'List '이라고 생각한다고 생각합니다. 문자열이 아닌 새 참조를 사용하여 객체를 추가하면 이전 참조가 'ClassCastException'을 throw하지 않고도 해당 객체에 액세스 할 수 없습니다. –

1
List<Object> ofObjects = new ArrayList<Object>(ofStrings); 

같이 :

import java.util.*; 
class C { 
    public static void main(String[] args) { 
    List<String> s = new ArrayList<String>(); 
    s.add("S"); 
    List<Object> o = new ArrayList<Object>(s); 
    o.add(new Object()); 
    System.out.println( o); 

    } 
} 

다른 방법으로 당신은 addAll 방법을 시도 할 수있는 목록이있는 경우 개체 목록이 기존 목록입니다.

5

개인적으로 현재 가장 높은 평가를받은 답변이 모두 올바르지 만 어느 누구도 우아하고 재사용 가능한 방식으로 문제를 해결하지 못한다고 생각합니다. 특히이 작업을 자주해야하는 경우에는 더욱 그렇습니다.

는 @ReverendGonzo는 in his comment를 제안은 적어도 List<? extends Object>을 받아 들일 수 있도록 당신이 (어떤 방식으로 변경할 수 없습니다 오래된 레거시 코드/종속성이 있다고 가정하자.이 기존 모듈 많은 이야기를 할 필요가 있음을, 또한 가정하자.

항상 캐스팅/복사하는 것이 장기적으로는 견딜 수 없을 것이라고 생각합니다. 코드가 교활한 버그에 취약하거나 따르기가 어렵거나 비효율적이며 읽기가 힘들어집니다.

읽기 쉽고 효율적인 생산 코드를 얻으려면 더티 파트를 별도의 모듈로 캡슐화하는 것이 좋습니다. 무해하지만 추악한 던지기.

class ProductionCode { 
    public void doJob() { 
     List<String> strings = Arrays.asList("pear", "apple", "peach"); 
     StringMagicUtils.dealWithStrings(strings); 
    } 
} 

class StringMagicUtils { 
    @SuppressWarnings("unchecked") 
    public static void dealWithStrings(List<String> strings) { 
     ExternalStringMagic.dealWithStringsAsObjects((List) strings); 
    } 
} 

// Legacy - cannot edit this wonderful code below ˇˇ 
class ExternalStringMagic { 
    public static void dealWithStringsAsObjects(List<Object> stringsAsObjects) { 
     // deal with them as they please 
    } 
} 
관련 문제