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

나는이 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. 명중과 재판. 🙂

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



답변

이것을 사용하십시오 :

List<SomeBean> newList = new ArrayList<SomeBean>(otherList);

참고 : 수정하면 여전히 스레드로부터 안전하지 otherList다른 스레드에서, 당신은 확인 할 수 있습니다 otherList(심지어 및 newListA) CopyOnWriteArrayList– 나 같은 프리미티브 잠금을 사용, 예를 들어 ReentrantReadWriteLock 어떤 목록입니다 읽기 직렬화 / 쓰기 액세스를 동시에 액세스.


답변

이것은 정말 좋은 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());


답변

originalArrayList.addAll(copyArrayofList);

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

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


답변

나는 이와 같은 것을 시도했지만 여전히 IndexOutOfBoundsException을 얻었습니다.

ConcurrentAccessException이 발생했습니다

이것은 다른 스레드에서 복사하려고 시도하는 동안 목록을 수정하고 있음을 의미합니다. 이 문제를 해결하려면 다음 중 하나를 수행해야합니다.

  • 동시 액세스 용으로 설계된 모음을 사용하십시오.

  • 컬렉션을 적절히 잠그면 반복 할 수 있습니다 (또는이를 수행하는 메서드를 호출하도록 허용)

  • 원본 목록을 복사하지 않아도되는 거리를 찾으십시오.


답변

Java 10 에서 시작 :

List<E> oldList = List.of();
List<E> newList = List.copyOf(oldList);

List.copyOf()List주어진의 요소를 포함 하는 수정 불가능한 것을 리턴합니다 Collection.

주어진 Collection은이어야하며 요소를 null포함해서는 안됩니다 null.

또한의 깊은 사본을 만들려면 여기에서List 많은 좋은 답변을 찾을 수 있습니다 .


답변

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

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

한 요소를 건너 뛰려면

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

Java 9+에서는 Optional의 스트림 방법을 사용할 수 있습니다

Optional.ofNullable(wsList)
    .stream()
    .flatMap(Collection::stream)
    .collect(Collectors.toList())


답변

나는 ConcurrentAccessException 과 같은 문제가 있었고 내 해결책은 다음과 같습니다.

List<SomeBean> tempList = new ArrayList<>();

for (CartItem item : prodList) {
  tempList.add(item);
}
prodList.clear();
prodList = new ArrayList<>(tempList);

따라서 한 번에 하나의 작업 만 작동하고 예외를 피합니다 …