Поиск человека по имени

35. Найти первого человека по имени

Условие задачи:
Дан класс Person с полями name и age.

Необходимо реализовать метод findPersonByName(List<Person> persons, String name), который возвращает первого человека из списка с заданным именем.

Если человек с таким именем не найден, метод должен вернуть Optional.empty().

Код:

class Person {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}

public class PersonService {

    public Optional<Person> findPersonByName(
            List<Person> persons,
            String name
    ) {
        // TODO
        return Optional.empty();
    }
}

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

Подсказки
💡 Создай поток из списка через stream().
💡 С помощью filter() оставь только людей с нужным именем.
💡 Для безопасного сравнения строк можно использовать Objects.equals().
💡 findFirst() вернёт первого найденного человека в виде Optional<Person>.

Решение
public Optional<Person> findPersonByName(
        List<Person> persons,
        String name
) {
    return persons.stream()
            .filter(person -> Objects.equals(person.getName(), name))
            .findFirst();
}

Фильтрация выполняется по имени:

.filter(person -> Objects.equals(person.getName(), name))

Objects.equals() корректно сравнивает значения даже в случае null:

Objects.equals("Ivan", "Ivan") → true
Objects.equals(null, "Ivan")   → false
Objects.equals(null, null)     → true

После фильтрации:

.findFirst()

возвращает первый подходящий объект как Optional<Person>.

Если совпадений нет, результатом автоматически будет:

Optional.empty()

Временная сложность в худшем случае — O(n), дополнительная память — O(1) без учёта внутренних объектов Stream API.