Изравняване на вложени колекции в Java

1. Общ преглед

В тази бърза статия ще разгледаме как да изравним вложената колекция в Java.

2. Пример за вложена колекция

Да предположим, че имаме списък със списъци от тип String .

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

3. Изравняване на списъка с forEach

За да изравним тази вложена колекция в списък с низове, можем да използваме forEach заедно с препратка към метод Java 8:

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

И тук можете да видите метода в действие:

@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. Изравняване на списъка с flatMap

Също така можем да изравним вложения списък, като използваме метода flatMap от Stream API.

Това ни позволява да изравним вложената структура на потока и в крайна сметка да съберем всички елементи в определена колекция:

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

И ето логиката в действие:

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

5. Заключение

Един прост метод forEach или flatMap в Java 8, в комбинация с препратки към методи, може да се използва за изравняване на вложени колекции.

Можете да намерите кода, обсъден в тази статия, на GitHub.