import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class IandT {
    enum Sport {Baseball, Football,Basketball,Hockey}

    class athlete {
        public Sport game;
        public String name;
        public String year;  //Frosh, Soph, Jr, Senior
        public int testgrade; //entrance exam grade

        public athlete(Sport s,String n,String y,int t){
            game=s;
            name=n;
            year=y;
            testgrade=t;
        }
    }

    public static void main(String args[]) {
        new IandT();
    }
    public IandT(){
        athlete ss = new athlete(Sport.Baseball, "Dan Smith", "Jr", 95);
        athlete jj = new athlete(Sport.Basketball, "Joe Johnson", "Jr", 93);
        athlete rb = new athlete(Sport.Baseball,"Robert Brown", "Soph", 87);
        athlete bj = new athlete(Sport.Hockey, "Bob Jones", "Jr", 85);
        athlete jr = new athlete(Sport.Baseball, "Joe Roberts", "Senior", 65);
        athlete le = new athlete(Sport.Basketball,"Frank Edwards", "Soph", 75);
        List<athlete> allplayers = new ArrayList<>();
        allplayers.add(ss);allplayers.add(jj);allplayers.add(rb);
        allplayers.add(bj);allplayers.add(jr);allplayers.add(le);
        List<athlete> allplayers1 = new ArrayList<>();
        allplayers1=allplayers;
        List<athlete> allplayers2 = new ArrayList<>();
        allplayers2=allplayers;
        ////////////////////////////////////////////////////
        allplayers.stream()
        .map((s)->{
                 s.testgrade=100;
                 return s;
             })
        // .forEach((s)->System.out.println("name")) error forEach() is terminal
        .filter((s) -> s.game==Sport.Baseball)
        .map((s)->{
                 s.testgrade=90;
                 return s;
             })
        .forEach((s)->System.out.println("Just closing the Stream."));
        for (athlete s:allplayers)System.out.println(s.name+" "+s.testgrade);
        ////////////////////////////////////////////////////////////////
        System.out.println("            Without a Terminal");
        Stream<athlete> AStream= allplayers1.stream()
                                 .map((s)->{
                                          s.testgrade=100;
                                          return s;
                                      })
                                 .filter((s) -> s.game==Sport.Baseball)
                                 .map((s)->{
                                          s.testgrade=90;
                                          return s;
                                      });

        for (athlete s:allplayers1)System.out.println(s.name+" "+s.testgrade);
        //////////////////////////////////////////////////////////////////////////
        System.out.println("            Using AStream");
        AStream.filter((s) -> s.game==Sport.Baseball)
        .forEach((s)->System.out.println(s.name));


        ////////////////////////////////////////////////////////////////
        //
        // Error void cannot be converted into a Stream  
        /*
        Stream<athlete> AStream1=  allplayers2.stream()
        .map((s)->{
                 s.testgrade=100;
                 return s;
             })
        .filter((s) -> s.game==Sport.Baseball)
        .map((s)->{
                 s.testgrade=90;
                 return s;
             })
        .forEach((s)->System.out.println("Just closing the Stream Again"));
        */

    }
}