Фильтр по фамилии

4. Отфильтровать и отсортировать фамилии

Условие задачи:
Дан список строк, содержащих полные ФИО в формате «фамилия имя отчество».

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

  • получить фамилию из каждой строки;

  • оставить только фамилии длиной больше 3 символов;

  • отсортировать фамилии в алфавитном порядке;

  • собрать результат в список.

Код:

public class Main {
    public static void main(String[] args) {
        var fios = List.of(
            "Петров Петр Петрович",
            "Иванов Иван Иванович",
            "Алексеев Алексей Алексеевич",
            "Васильев Василий Васильевич",
            "Сидоров Сидор Сидорович",
            "Николаев Николай Николаевич",
            "Андреев Андрей Андреевич"
        );
    }
}

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

Подсказки
💡 Через map() преобразуй каждое ФИО в фамилию.
💡 Фамилия — первая часть строки.
💡 Через filter() оставь фамилии длиной больше 3 символов.
💡 sorted() выполняет сортировку строк в естественном порядке.
💡 toList() собирает результат в список.

Решение
List<String> result = fios.stream()
        .map(fio -> fio.split("\\s+")[0])
        .filter(surname -> surname.length() > 3)
        .sorted()
        .toList();

Сначала:

.map(fio -> fio.split("\\s+")[0])

разбивает ФИО по пробельным символам и берёт первую часть — фамилию.

Затем:

.filter(surname -> surname.length() > 3)

оставляет только фамилии длиной больше трёх символов.

После этого:

.sorted()

сортирует фамилии в естественном порядке строк.

Для приведённых данных результат будет:

[Алексеев, Андреев, Васильев, Иванов, Николаев, Петров, Сидоров]

Если используется Java до версии 16, вместо toList() можно использовать:

.collect(Collectors.toList());

Временная сложность определяется сортировкой — O(n log n), дополнительная память — O(n).