Achatando coleções aninhadas em Java
1. Visão geral
Neste artigo rápido, vamos explorar como nivelar uma coleção aninhada em Java.
2. Exemplo de uma coleção aninhada
Suponha que temos uma lista de listas do tipoString.
List> nestedList = asList(
asList("one:one"),
asList("two:one", "two:two", "two:three"),
asList("three:one", "three:two", "three:three", "three:four"));
3. Achatando oList comforEach
Para nivelar essa coleção aninhada em uma lista de strings, podemos usarforEach junto com uma referência de método Java 8:
public List flattenListOfListsImperatively(
List> nestedList) {
List ls = new ArrayList<>();
nestedList.forEach(ls::addAll);
return ls;
}
E aqui você pode ver o método em ação:
@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. Achatando oList comflatMap
Também podemos nivelar a lista aninhada utilizando o métodoflatMap da APIStream.
Isso nos permite nivelar a estruturaStream aninhada e, eventualmente, coletar todos os elementos para uma coleção particular:
public List flattenListOfListsStream(List> list) {
return list.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
E aqui está a lógica em ação:
@Test
public void givenNestedList_thenFlattenFunctionally() {
List ls = flattenListOfListsStream(nestedList);
assertNotNull(ls);
assertTrue(ls.size() == 8);
}
5. Conclusão
MétodosforEach or flatMap simples em Java 8, em combinação com referências de método, podem ser usados para achatar coleções aninhadas.
Você pode encontrar o código discutido neste artigoover on GitHub.