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).