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

1概要

この簡単な記事では、Javaでネストしたコレクションを平坦化する方法を探ります。

2入れ子になったコレクションの例

String 型のリストのリストがあるとします。

List<List<String>> nestedList = asList(
  asList("one:one"),
  asList("two:one", "two:two", "two:three"),
  asList("three:one", "three:two", "three:three", "three:four"));

3 forEach を使用して List を平坦化する

この入れ子になったコレクションを文字列のリストに平坦化するために、Java 8のメソッド参照と一緒に forEach を使用できます。

public <T> List<T> flattenListOfListsImperatively(
    List<List<T>> nestedList) {
    List<T> ls = new ArrayList<>();
    nestedList.forEach(ls::addAll);
    return ls;
}

そしてここであなたは実行中のメソッドを見ることができます:

@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"));
}

4 flatMap を使用して List を平坦化する

Stream APIの flatMap メソッドを使用してネストされたリストを平坦化することもできます。

これにより、入れ子になった Stream 構造体を平坦化し、最終的にすべての要素を特定のコレクションに集めることができます。

public <T> List<T> flattenListOfListsStream(List<List<T>> list) {
    return list.stream()
      .flatMap(Collection::stream)
      .collect(Collectors.toList());
}

そして、これが実行中の論理です。

@Test
public void givenNestedList__thenFlattenFunctionally() {
    List<String> ls = flattenListOfListsStream(nestedList);

    assertNotNull(ls);
    assertTrue(ls.size() == 8);
}

5結論

Java 8の単純な forEachまたはflatMap メソッドは、メソッド参照と組み合わせて、ネストされたコレクションを統合するために使用できます。

Git on GitHub で説明されているコードを見つけることができます。