Написать реализацию метода findPersonByName()

9. Реализовать поиск человека по имени

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

Необходимо реализовать метод findPersonByName(), который:

  • принимает список List<Person>;

  • ищет человека с указанным именем;

  • возвращает первого найденного человека;

  • если совпадений нет, возвращает Optional.empty().

Код:

class Person {
    String name;
    Integer age;
}

Optional<Person> findPersonByName(List<Person> persons, String name) {
    // ...
}

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

Подсказки
💡 Можно пройти по списку через Stream API и оставить только людей с нужным именем.
💡 Для получения первого совпадения используй findFirst().
💡 Objects.equals() позволяет безопасно сравнивать строки, даже если одно из значений равно null.
💡 Альтернативно задачу можно решить обычным циклом.

Решение

Вариант через Stream API:

public static Optional<Person> findPersonByName(
        List<Person> persons,
        String name
) {
    return persons.stream()
            .filter(person -> Objects.equals(person.name, name))
            .findFirst();
}

Условие:

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

оставляет только людей с нужным именем.

Objects.equals() безопасно обрабатывает null:

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

После этого:

.findFirst()

возвращает первого подходящего человека как Optional<Person>. Если совпадений нет, возвращается Optional.empty().

Альтернативный вариант через обычный цикл:

public static Optional<Person> findPersonByName(
        List<Person> persons,
        String name
) {
    for (Person person : persons) {
        if (Objects.equals(person.name, name)) {
            return Optional.of(person);
        }
    }

    return Optional.empty();
}

Оба варианта прекращают поиск после первого найденного совпадения.

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