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.