Hi There!

I'm Dan Schlegel, an Associate Professor in the Computer Science Department at SUNY Oswego

Person

Adapted heavily from Java Lambda tutorials

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.Collections;

// We used this interface before settling on a functional interface
// interface CheckPerson {
//     public boolean test(Person p);
// }

public class Person {

    public enum Sex {
        MALE, FEMALE
    }

    String name;
    int age;
    Sex sex;
    String emailAddress;

    public int getAge() {
        return age;
    }

    public void printPerson() {
        System.out.println("Name: " + name + " Sex: "
                           + sex + " Age: " + age
                           + " Email: " + emailAddress);
    }

    @Override
    public String toString(){
        return name;
    }

    public Sex getSex(){
        return sex;
    }

    public String getName() {
        return name;
    }

    public Person(String name, Sex sex, int age, String emailAddress){
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.emailAddress = emailAddress;
    }

    /************************/
    /*** Original Version ***/
    /************************/
    
    /*public static void printPersonsOlderThan(List roster, int age){
        for (Person p : roster)
            if (p.getAge() > age)
                p.printPerson();
    }

    public static void printPersonsAgeBetween(List roster,
                                              int lowage, int highage){
        for (Person p : roster)
            if (p.getAge() > lowage && p.getAge() < highage)
                p.printPerson();
    }*/

    /************************************/
    /*** Functional Interface Version ***/
    /************************************/
    public static void printPersonsWithCondition(List roster,
                                                 Predicate checker){
        for (Person p : roster)
            if (checker.test(p))
                p.printPerson();
    }
    
    public static void main(String[] args){
        Person dan = new Person("Dan", Sex.MALE, 31, "daniel.schlegel@oswego.edu");
        Person phil = new Person("Phil", Sex.MALE, 22, "phil@philsdomain.org");
        Person alexis = new Person("Alexis", Sex.FEMALE, 44, "alexis@alexis.jp");
        Person julie = new Person("Julie", Sex.FEMALE, 35, "julue@google.com");

        List persons = new ArrayList<>();
        persons.add(dan);
        persons.add(phil);
        persons.add(alexis);
        persons.add(julie);

        System.out.println("Entire List:");
        for (Person p : persons)
            p.printPerson();

        /* Original */
        // Persons over 30:
        // System.out.println("Older than 30:");
        // printPersonsOlderThan(persons, 30);

        // System.out.println("Between 18 and 40:");
        // printPersonsAgeBetween(persons, 18, 40);

        /* Lambda */
        // Persons over 30:
        // System.out.println("Older than 30:");
        // Predicate over30 = p -> p.getAge() > 30;
        // printPersonsWithCondition(persons, over30);

        // System.out.println("Between 18 and 40:");
        // printPersonsWithCondition(persons,
        //                        p -> p.getAge() > 18 && p.getAge() < 40);
        
        /* Stream */
        // Names of persons over 30
        System.out.println("Names of persons over 30:");
        // Uses peek to check on our intermediate progress. 
        List outlist = persons.stream()
            .filter(p -> p.getAge() > 30)
            .peek(Person::printPerson)
            .map(p -> p.getName())
            .peek(System.out::println)
            .collect(Collectors.toList());
    }
}