Фильтрация и группировка имён

12. Отфильтровать и сгруппировать имена по длине

Условие задачи:
Дан список имён пользователей.

Необходимо с помощью Stream API:

  • оставить только имена, начинающиеся с буквы А;

  • сгруппировать их по длине;

  • вернуть результат в виде Map<Integer, List<String>>, где:

    • ключ — длина имени;

    • значение — список имён такой длины.

Код:

public class Main {

    public static void main(String[] args) {
        List<String> names = List.of(
                "Анна",
                "Александр",
                "Андрей",
                "Антон",
                "Борис",
                "Богдан",
                "Мария",
                "Максим",
                "Артём"
        );

        System.out.println(processNames(names));
    }

    public static Map<Integer, List<String>> processNames(List<String> names) {
        return null;
    }
}

Ожидаемый результат:

{4=[Анна], 5=[Антон, Артём], 6=[Андрей], 9=[Александр]}

Спойлеры к решению

Подсказки
💡 Создай поток через stream().
💡 Через filter() оставь только строки, начинающиеся с "А".
💡 Для группировки используй Collectors.groupingBy().
💡 Ключом группы будет длина строки — String::length.

Решение
public static Map<Integer, List<String>> processNames(List<String> names) {
    return names.stream()
            .filter(name -> name.startsWith("А"))
            .collect(Collectors.groupingBy(String::length));
}

Сначала:

.filter(name -> name.startsWith("А"))

оставляет только имена, начинающиеся с буквы А.

Затем:

.collect(Collectors.groupingBy(String::length))

группирует имена по их длине.

Для исходных данных группы будут такими:

4 -> [Анна]
5 -> [Антон, Артём]
6 -> [Андрей]
9 -> [Александр]

Тип результата:

Map<Integer, List<String>>

Временная сложность — O(n), дополнительная память — O(n) для результата.