Java 중첩된 컬렉션 병합
1. 중첩 컬렉션의 예
String 유형의 목록이 있다고 가정한다.
1
2
3
4
List<List<String>> nestedList = asList(
asList("one:one"),
asList("two:one", "two:two", "two:three"),
asList("three:one", "three:two", "three:three", "three:four"));
2. forEach로 List 병합
이 중첩된 컬렉션을 문자열 목록으로 병합하기 위해 Java 8 메서드 참조와 함께 forEach를 사용할 수 있다.
1
2
3
4
5
6
public <T> List<T> flattenListOfListsImperatively(
List<List<T>> nestedList) {
List<T> ls = new ArrayList<>();
nestedList.forEach(ls::addAll);
return ls;
}
실제 사용 방법은 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
@Test
public void givenNestedList_thenFlattenImperatively() {
List<String> ls = flattenListOfListsImperatively(nestedList);
assertNotNull(ls);
assertTrue(ls.size() == 8);
assertThat(ls, IsIterableContainingInOrder.contains(
"one:one",
"two:one", "two:two", "two:three", "three:one",
"three:two", "three:three", "three:four"));
}
3. flatMap으로 List 병합
Stream API의 flatMap 메서드를 활용하여 중첩 목록을 평면화할 수도 있다.
이를 통해 중첩된 Stream 구조를 평면화 하고 결국 모든 요소를 특정 컬렉션으로 수집할 수 있다.
1
2
3
4
5
public <T> List<T> flattenListOfListsStream(List<List<T>> list) {
return list.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
사용 방법은 다음과 같다.
1
2
3
4
5
6
7
@Test
public void givenNestedList_thenFlattenFunctionally() {
List<String> ls = flattenListOfListsStream(nestedList);
assertNotNull(ls);
assertTrue(ls.size() == 8);
}
[출처 및 참고]
This post is licensed under CC BY 4.0 by the author.