Task Livecoding Find Person by Name

14. Написать реализацию метода findPersonByName(). Из списка persons найти человека с именем name #

class Person {
    String name;
    Integer age;
}

Optional<Person> findPersonByName(List<Person> persons, String name) {
//...
}
Спойлеры к решению
Подсказки
🔹 Нам нужно найти объект Person, у которого name совпадает с переданным.
🔹 Лучше вернуть Optional<Person>, чтобы избежать null.
🔹 Можно использовать stream() и filter(), либо традиционный for-цикл.
Решение

С использованием stream() (современный вариант)

import java.util.List;
import java.util.Optional;

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

📌 Объяснение:

  • stream() создает поток элементов списка.
  • filter() пропускает только тех, у кого name совпадает.
  • findFirst() берет первый найденный элемент.
  • Используем Optional<Person>, чтобы избежать null.

С использованием for-цикла (традиционный вариант)

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

📌 Объяснение:

  • Пробегаем список persons.
  • Если находим совпадение, оборачиваем результат в Optional.of().
  • Если ничего не найдено – возвращаем Optional.empty().

🔥 Какой вариант лучше?
stream() – элегантный и читаемый, но может быть немного медленнее из-за создания потока.
for-цикл – быстрее для небольших списков и понятен новичкам.

Выбор зависит от контекста 🚀