Java에서 두 목록에 어떻게 참여합니까? 또는 JDK 1.3 버전의 보너스 포인트. 다음보다 간단한

조건 : 원본 목록을 수정하지 마십시오. 외부 라이브러리가없는 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);