import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;

public class StudentAndFilters {
    record Student(String name, Integer age) { }

    private static final Pattern EMAIL_FORM =
            Pattern.compile("^[^@\\s]+@[^@\\s]+$");

    static Optional<String> optionalName(Student student) {
        return Optional.ofNullable(student.name());
    }

    static List<Student> filterStudents(
            List<Student> students, String name, Integer age) {
        return students.stream()
                .filter(student -> student.name().equals(name))
                .filter(student -> age == null || age.equals(student.age()))
                .toList();
    }

    public static void main(String[] args) {
        Optional<String> email = Optional.of("ada@example.org");
        System.out.println(email.filter(
                value -> EMAIL_FORM.matcher(value).matches()).isPresent());
        System.out.println(Optional.of("ada.example.org").filter(
                value -> EMAIL_FORM.matcher(value).matches()).isPresent());

        Optional<Student> student = Optional.of(new Student("Ada", 20));
        System.out.println("age present: " + student.map(Student::age).isPresent());
        System.out.println("name: " + student.flatMap(
                StudentAndFilters::optionalName).orElse("absent"));
        System.out.println("filtered: " + filterStudents(
                List.of(new Student("Ada", 20), new Student("Ada", 21)),
                "Ada", 20).size());
    }
}
