Javaでのネストされたコレクションのフラット化
1. 概要
この簡単な記事では、Javaでネストされたコレクションをフラット化する方法について説明します。
2. ネストされたコレクションの例
タイプStringのリストのリストがあるとします。
List> nestedList = asList(
asList("one:one"),
asList("two:one", "two:two", "two:three"),
asList("three:one", "three:two", "three:three", "three:four"));
3. ListをforEachで平坦化する
このネストされたコレクションを文字列のリストにフラット化するために、Java 8メソッド参照と一緒にforEachを使用できます。
public List flattenListOfListsImperatively(
List> nestedList) {
List ls = new ArrayList<>();
nestedList.forEach(ls::addAll);
return ls;
}
そして、ここで実際のメソッドを見ることができます:
@Test
public void givenNestedList_thenFlattenImperatively() {
List 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"));
}
4. ListをflatMapで平坦化する
Stream APIのflatMapメソッドを利用して、ネストされたリストをフラット化することもできます。
これにより、ネストされたStream構造をフラット化し、最終的にすべての要素を特定のコレクションに収集できます。
public List flattenListOfListsStream(List> list) {
return list.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
そして、これが実際のロジックです。
@Test
public void givenNestedList_thenFlattenFunctionally() {
List ls = flattenListOfListsStream(nestedList);
assertNotNull(ls);
assertTrue(ls.size() == 8);
}
5. 結論
Java 8の単純なforEach or flatMapメソッドは、メソッド参照と組み合わせて、ネストされたコレクションをフラット化するために使用できます。
この記事over on GitHubで説明されているコードを見つけることができます。