Javaでネストしたコレクションを平坦化する

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. ListforEachで平坦化する

このネストされたコレクションを文字列のリストにフラット化するために、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. ListflatMapで平坦化する

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で説明されているコードを見つけることができます。