1. 개요

이 사용방법(예제)에서는 여러 컬렉션을 하나의 논리적 컬렉션으로 연결하는 방법을 설명합니다.

Java 8을 사용하는 두 가지, Guava를 사용하는 방법, Apache Commons Collections를 사용하는 방법 및 표준 Java 7 SDK만 사용하는 방법의 다섯 가지 접근 방식을 살펴보겠습니다.

다음 예에서 다음 컬렉션을 고려해 보겠습니다.

Collection<String> collectionA = Arrays.asList("S", "T");
Collection<String> collectionB = Arrays.asList("U", "V");

2. 자바 8 스트림 API 사용 하기

Java API Stream 인터페이스는 컬렉션을 보다 쉽게 ​​처리할 수 있는 유용한 메서드를 제공합니다. 컬렉션을 결합하는 데 사용되는 concat()flatMap()의 두 가지 메서드를 살펴보겠습니다 .

Stream 을 얻으면 이에 대해 집계 작업을 수행할 수 있습니다.

2.1. 은 Using CONCAT ()를 방법

정적 메서드 concat()요소가 첫 번째 Stream 의 모든 요소 뒤에 오는 두 번째 Stream 의 모든 요소인 지연 연결된 Stream 을 만들어 논리적으로 Streams를 결합 합니다.

아래 예제에서는 concat() 메서드를 사용 하여 collectionAcollectionB결합해 보겠습니다 .

Stream<String> combinedStream = Stream.concat(
  collectionA.stream(),
  collectionB.stream());

두 개 이상의 Streams 를 결합해야 하는 경우 원래 호출 내에서 concat() 메서드를 다시 호출할 수 있습니다 .

Stream<String> combinedStream = Stream.concat(
  Stream.concat(collectionA.stream(), collectionB.stream()), 
  collectionC.stream());

Java 8 스트림 은 재사용할 수 없으므로 변수에 할당할 때 이를 고려해야 합니다.

2.2. 은 Using flatMap을 () 메소드

flatMap () 메소드는 반환 스트림 이 각각의 요소로 대체 한 후 스트림 매핑의 내용 트림 각 요소에 제공 매핑 함수를 적용함으로써 생성된다.

아래 예제는 flatMap() 메서드를 사용하여 컬렉션을 병합하는 방법을 보여줍니다 . 처음에는 요소가 두 컬렉션인 Stream 을 얻은 다음 병합된 List으로 수집하기 전에 Stream 을 평면화 합니다.

Stream<String> combinedStream = Stream.of(collectionA, collectionB)
  .flatMap(Collection::stream);
Collection<String> collectionCombined = 
  combinedStream.collect(Collectors.toList());

3. 구아바 사용하기

Google의 Guava 라이브러리는 컬렉션 작업을 위한 몇 가지 편리한 방법을 제공하며 Java 6 이상에서 사용할 수 있습니다.

3.1. 은 Using Iterables.concat () 메소드를

Iterables.concat () 메소드는 컬렉션을 병합하는 데 사용되는 구아바 편리한 방법이다 :

Iterable<String> combinedIterables = Iterables.unmodifiableIterable(
  Iterables.concat(collectionA, collectionA));

반환 Iterable 은 컬렉션으로 변환할 수 있습니다.

Collection<String> collectionCombined = Lists.newArrayList(combinedIterables);

3.2. 메이븐 의존성

Maven pom.xml 파일에 다음 의존성을 추가 하여 프로젝트에 Guava 라이브러리를 포함합니다.

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>20.0</version>
</dependency>

Maven Central 저장소 에서 최신 버전의 Guava 라이브러리를 찾을 수 있습니다 .

4. Apache Commons 컬렉션 사용

Apache Commons Collections는 다양한 컬렉션 작업을 지원하는 또 다른 유틸리티 라이브러리입니다. 라이브러리는 컬렉션을 결합하는 데 사용할 수 있는 두 가지 유틸리티 메서드를 제공합니다. 이 섹션에서는 이러한 방법이 어떻게 작동하는지 이해하겠습니다.

4.1. 은 Using IterableUtils.chainedIterable () 메소드를

IterableUtils의 클래스를위한 유틸리티 방법과 장식 자 제공 의 Iterable 인스턴스를. 여러 Iterable 을 하나로 결합하는 데 사용할 수 있는 chainedIterable() 메서드를 제공합니다 .

Iterable<String> combinedIterables = IterableUtils.chainedIterable(
  collectionA, collectionB);

4.2. 은 Using CollectionUtils.union을 () 메소드

Collection 인스턴스의 유틸리티 메서드 및 데코레이터 CollectionUtils 클래스에서 제공합니다 . 이 클래스 union() 메서드 는 주어진 Iterable 인스턴스 의 합집합을 포함 하는 Collection반환 합니다.

Iterable<String> combinedIterables = CollectionUtils.union(
  collectionA, collectionB);

Union() 메서드 의 경우 반환된 컬렉션에 있는 각 요소의 카디널리티는 주어진 두 Iterables 에서 해당 요소의 카디널리티의 최대값과 같습니다 . 즉, 결합된 컬렉션은 첫 번째 컬렉션의 요소와 첫 번째 컬렉션에 없는 두 번째 컬렉션의 요소로만 구성됩니다.

4.3. 메이븐 의존성

Maven pom.xml 파일에 다음 의존성을 추가 하여 프로젝트에 Apache Commons Collections 라이브러리를 포함합니다.

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

Maven Central 저장소 에서 Apache Commons 라이브러리의 최신 버전을 찾을 수 있습니다 .

5. 자바 7 사용하기

여전히 Java 7을 사용 중이고 Guava와 같은 타사 라이브러리를 사용하지 않으려면 addAll() 메서드를 사용하여 여러 컬렉션의 요소를 결합하거나 고유한 유틸리티 메서드를 작성하여 Iterables 를 결합할 수 있습니다 .

5.1. 은 Using 오퍼레이션과 addAll ()를 방법

물론 컬렉션을 결합하는 가장 간단한 솔루션 은 다음 List 예제 와 같이 addAll() 메서드를 사용하는 것입니다.

List<String> listC = new ArrayList<>();
listC.addAll(listA);
listC.addAll(listB);

5.2. 사용자 지정 concat() 메서드 작성

아래 예제 는 두 개의 Iterable 을 받아들이고 병합된 Iterable 객체를 반환하는 concat() 메서드를 정의 합니다.

public static <E> Iterable<E> concat(
  Iterable<? extends E> i1,
  Iterable<? extends E> i2) {
        return new Iterable<E>() {
            public Iterator<E> iterator() {
                return new Iterator<E>() {
                    Iterator<? extends E> listIterator = i1.iterator();
                    Boolean checkedHasNext;
                    E nextValue;
                    private boolean startTheSecond;

                    void theNext() {
                        if (listIterator.hasNext()) {
                            checkedHasNext = true;
                            nextValue = listIterator.next();
                        } else if (startTheSecond)
                            checkedHasNext = false;
                        else {
                            startTheSecond = true;
                            listIterator = i2.iterator();
                            theNext();
                        }
                    }

                    public boolean hasNext() {
                        if (checkedHasNext == null)
                            theNext();
                        return checkedHasNext;
                    }

                    public E next() {
                        if (!hasNext())
                            throw new NoSuchElementException();
                        checkedHasNext = null;
                        return nextValue;
                    }

                    public void remove() {
                        listIterator.remove();
                    }
                };
            }
        };
    }

CONCAT () 메소드는 인수로서 두 개의 모음을 전달하여 호출 될 수있다 :

Iterable<String> combinedIterables = concat(collectionA, collectionB);
Collection<String> collectionCombined = makeListFromIterable(combinedIterables);

당신이 필요한 경우 의 Iterable는 A와 사용할 수 List , 당신은 또한 사용할 수 있습니다 makeListFromIterable () 생성 방법 List 의 구성원 사용 의 Iterable를 :

public static <E> List<E> makeListFromIterable(Iterable<E> iter) {
    List<E> list = new ArrayList<E>();
    for (E item : iter) {
        list.add(item);
    }
    return list;
}

6. 결론

이 기사에서는 두 컬렉션에 포함된 개체에 대한 추가 참조를 생성하지 않고 Java에서 논리적으로 두 컬렉션을 결합하는 여러 가지 방법에 대해 논의했습니다.

이 사용방법(예제)의 코드는 Github에서 사용할 수 있습니다 .

Junit footer banner