Achatando coleções aninhadas em Java

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.