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() 메서드를 사용 하여 collectionA 와 collectionB 를 결합해 보겠습니다 .
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에서 사용할 수 있습니다 .