조건 : 원본 목록을 수정하지 마십시오. 외부 라이브러리가없는 JDK 전용 1 라이너 또는 JDK 1.3 버전의 보너스 포인트.
다음보다 간단한 방법이 있습니까?
List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);
답변
자바 8 :
List<String> newList = Stream.concat(listOne.stream(), listTwo.stream())
.collect(Collectors.toList());
답변
내 머리 꼭대기에서 한 줄씩 줄일 수 있습니다.
List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);
답변
Apache commons-collections 라이브러리를 사용할 수 있습니다 .
List<String> newList = ListUtils.union(list1, list2);
답변
요구 사항 중 하나는 원본 목록을 유지하는 것입니다. 새 목록을 작성하고를 사용 addAll()
하면 목록 의 객체에 대한 참조 수가 효과적으로 두 배가됩니다. 목록이 매우 큰 경우 메모리 문제가 발생할 수 있습니다.
연결된 결과를 수정할 필요가없는 경우 사용자 정의 목록 구현을 사용하여이를 피할 수 있습니다. 커스텀 구현 클래스는 두 줄 이상이지만 분명히 사용하는 것은 짧고 달콤합니다.
CompositeUnmodifiableList.java :
public class CompositeUnmodifiableList<E> extends AbstractList<E> {
private final List<E> list1;
private final List<E> list2;
public CompositeUnmodifiableList(List<E> list1, List<E> list2) {
this.list1 = list1;
this.list2 = list2;
}
@Override
public E get(int index) {
if (index < list1.size()) {
return list1.get(index);
}
return list2.get(index-list1.size());
}
@Override
public int size() {
return list1.size() + list2.size();
}
}
용법:
List<String> newList = new CompositeUnmodifiableList<String>(listOne,listTwo);
답변
아마도 더 단순하지는 않지만 흥미롭고 추악합니다.
List<String> newList = new ArrayList<String>() { { addAll(listOne); addAll(listTwo); } };
프로덕션 코드에서 사용하지 마십시오 …;)
답변
또 다른 Java 8 one-liner :
List<String> newList = Stream.of(listOne, listTwo)
.flatMap(Collection::stream)
.collect(Collectors.toList());
보너스 Stream.of()
는 가변적이므로 원하는만큼 많은 목록을 연결할 수 있습니다.
List<String> newList = Stream.of(listOne, listTwo, listThree)
.flatMap(Collection::stream)
.collect(Collectors.toList());
답변
더 간단하지는 않지만 오버 헤드 크기를 조정하지 않은 경우 :
List<String> newList = new ArrayList<>(listOne.size() + listTwo.size());
newList.addAll(listOne);
newList.addAll(listTwo);