java.util.List를 다른 java.util.List에 복사하는 방법



Answers

이것은 그것을 수행하는 정말 멋진 Java 8 방법입니다.

List<String> list2 = list1.stream().collect(Collectors.toList());

물론 장점은 목록의 일부만 필터링하고 건너 뛸 수 있다는 것입니다.

//don't copy the first element 
List<String> list2 = list1.stream().skip(1).collect(Collectors.toList());
Question

웹 서비스에서 채워진 List<SomeBean> 이 있습니다. 그 목록의 내용을 동일한 유형의 빈 목록으로 복사 / 복제하려고합니다. 목록을 복사하기위한 Google 검색을 통해 Collections.copy() 메소드를 사용할 것을 제안했습니다. 내가 본 모든 예에서 대상 목록에는 복사 할 항목의 정확한 수가 포함되어 있어야합니다.

사용하고있는 목록이 웹 서비스를 통해 채워지며 수백 개의 개체가 포함되어 있으므로 위의 기술을 사용할 수 없습니다. 아니면 내가 잘못 사용하고있다 ?? !! 어쨌든, 작동하도록, 나는 이런 식으로하려고했지만, 여전히 IndexOutOfBoundsException 있습니다.

List<SomeBean> wsList = app.allInOne(template);

List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());   
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());

나는 wsListCopy=wsList.subList(0, wsList.size()) 를 사용하려했지만 나중에 코드에서 ConcurrentAccessException 얻었습니다. 명중과 재판. :)

어쨌든, 내 질문은 간단합니다, 어떻게 내 목록의 전체 내용을 다른 목록으로 복사 할 수 있습니까? 물론 반복하지 않습니다.




자바 10 :

List<T> newCopy = List.copyOf(anotherList);

List.copyOf(...) 는, 지정된 Collection의 요소를 포함한 변경 불가능한 List를 돌려줍니다.

지정된 Collection는 null 가 아니어야하며 null 요소가 없어야합니다.




나는 비슷한 것을 시도해보고 문제를 재현 할 수있었습니다 (IndexOutOfBoundsException). 아래는 나의 발견이다.

1) Collections.copy (destList, sourceList) 구현은 먼저 size () 메서드를 호출하여 대상 목록의 크기를 확인합니다. size () 메서드를 호출하면 항상 목록의 요소 수가 반환됩니다 (이 경우 0). ArrayList (capacity) 생성자는 배킹 배열의 초기 용량 만 보장하며 이는 배후 배열의 초기 용량을 보장합니다. 리스트의 크기. 따라서 우리는 항상 IndexOutOfBoundsException을 얻는다.

2) 상대적으로 간단한 방법은 컬렉션을 인수로 취하는 생성자를 사용하는 것입니다.

List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList);  



originalArrayList.addAll(copyArrayofList);

복사 할 때 addAll () 메서드를 사용할 때마다 동일한 객체에 대한 배열 목록 (originalArrayList 및 copyArrayofList) 참조의 내용이 목록에 추가되므로 어느 하나라도 수정하면 copyArrayofList도 같은 변화를 반영합니다.

부작용을 원하지 않으면 for 또는 while 루프를 사용하는 것과 같이 originalArrayList에서 copyArrayofList로 각 요소를 복사해야합니다.




목록의 일부를 복사해야하는 경우

List<String> list2 = itemList.subList(0, 9);



null-safe 방식으로 Java 8을 사용하는 다른 방법이 있습니다.

List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
                                    .map(List::stream)
                                    .orElseGet(Stream::empty)
                                    .collect(Collectors.toList());

하나의 요소를 건너 뛰려는 경우.

List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
                                    .map(List::stream)
                                    .orElseGet(Stream::empty)
                                    .skip(1)
                                    .collect(Collectors.toList());



Related