Перейти к основному содержимому

Сведение вложенных коллекций в Java

· 2 мин. чтения

1. Обзор

В этой быстрой статье мы рассмотрим, как свести вложенную коллекцию в Java.

2. Пример вложенной коллекции

Предположим, у нас есть список списков типа String .

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. Сведение списка с помощью forEach

Чтобы свести эту вложенную коллекцию в список строк, мы можем использовать forEach вместе со ссылкой на метод Java 8:

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

И здесь вы можете увидеть метод в действии:

@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. Сведение списка с помощью flatMap

Мы также можем сгладить вложенный список, используя метод flatMap из Stream API.

Это позволяет нам сгладить вложенную структуру Stream и в конечном итоге собрать все элементы в определенную коллекцию:

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

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

@Test
public void givenNestedList_thenFlattenFunctionally() {
List<String> ls = flattenListOfListsStream(nestedList);

assertNotNull(ls);
assertTrue(ls.size() == 8);
}

5. Вывод

Простые методы forEach или flatMap в Java 8 в сочетании со ссылками на методы можно использовать для выравнивания вложенных коллекций.

Вы можете найти код, обсуждаемый в этой статье , на GitHub .