java-flatten-nested-collections
Flattening Nested Collections in Java
2. Example of a Nested Collection
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. Flattening the List with forEach
In order to flatten this nested collection into a list of strings, we can use forEach together with a Java 8 method reference:
public <T> List<T> flattenListOfListsImperatively(
List<List<T>> nestedList) {
List<T> ls = new ArrayList<>();
nestedList.forEach(ls::addAll);
return ls;
}
And here you can see the method in action:
@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. Flattening the List with flatMap
This allows us to flatten the nested Stream structure and eventually collect all elements to a particular collection:
public <T> List<T> flattenListOfListsStream(List<List<T>> list) {
return list.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
And here’s the logic in action:
@Test
public void givenNestedList_thenFlattenFunctionally() {
List<String> ls = flattenListOfListsStream(nestedList);
assertNotNull(ls);
assertTrue(ls.size() == 8);
}
5. Conclusion
A simple forEach or flatMap methods in Java 8, in combination with method references, can be used for flattening nested collections.
You can find the code discussed in this article over on GitHub.