Appiattimento delle raccolte nidificate in Java

1. Panoramica

In questo rapido articolo, esploreremo come appiattire una raccolta nidificata in Java.

2. Esempio di una raccolta annidata

Supponiamo di avere un elenco di elenchi di tipo String .

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

3. Appiattire l' elenco con forEach

Per appiattire questa raccolta nidificata in un elenco di stringhe, possiamo usare forEach insieme a un riferimento al metodo Java 8:

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

E qui puoi vedere il metodo in azione:

@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. Appiattimento dell'elenco con flatMap

Possiamo anche appiattire l'elenco nidificato utilizzando il metodo flatMap dall'API Stream .

Questo ci consente di appiattire la struttura Stream annidata e alla fine raccogliere tutti gli elementi in una raccolta particolare:

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

Ed ecco la logica in azione:

@Test public void givenNestedList_thenFlattenFunctionally() { List ls = flattenListOfListsStream(nestedList); assertNotNull(ls); assertTrue(ls.size() == 8); }

5. conclusione

Un semplice metodo forEach o flatMap in Java 8, in combinazione con i riferimenti ai metodi, può essere utilizzato per appiattire le raccolte nidificate.

Puoi trovare il codice discusso in questo articolo su GitHub.