
import java.time.LocalDate;
import java.time.chrono.IsoChronology;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;

class Person {

    String name;
    LocalDate birthday;
    Sex gender;
    String emailAddress;

    Person(String nameArg, LocalDate birthdayArg, Sex genderArg, String emailArg) {
        name = nameArg;
        birthday = birthdayArg;
        gender = genderArg;
        emailAddress = emailArg;
    }

    public enum Sex {
        MALE, FEMALE
    }

    public void printPerson() {
        System.out.println(name + ", " + this.getAge());
    }

    public int getAge() {
        return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears();
    }

    public Sex getGender() {
        return gender;
    }

    public String getName() {
        return name;
    }

    public String getEmailAddress() {
        return emailAddress;
    }
}

class JavaLambda {
    private static ArrayList<Person> members = new ArrayList<>();

    public static void main(String[] args) throws java.lang.Exception {

        members.add(new Person("Fred", IsoChronology.INSTANCE.date(1980, 6, 20), Person.Sex.MALE, "fred@example.com"));
        members.add(new Person("Jane", IsoChronology.INSTANCE.date(1990, 7, 15), Person.Sex.FEMALE, "jane@example.com"));
        members.add(new Person("Mark", IsoChronology.INSTANCE.date(1990, 7, 15), Person.Sex.MALE, "mark@example.com"));
        members.add(new Person("George", IsoChronology.INSTANCE.date(1991, 8, 13), Person.Sex.MALE, "george@example.com"));
        members.add(new Person("Bob", IsoChronology.INSTANCE.date(2000, 9, 12), Person.Sex.MALE, "bob@example.com"));

Map<Integer, List<String>> collect = 
            members.stream()
                   .collect(groupingBy(
                           Person::getAge,
                           mapping(Person::getName, toList()))
                   );
        System.out.println(collect);
    }
}