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