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
-цикл – быстрее для небольших списков и понятен новичкам.
Выбор зависит от контекста 🚀