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