StreamArrayListProcessing.java
package arraylists;

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

public class StreamArrayListProcessing {
    public static void main(String[] args) {
        //POINT A: Add some string which represent names to an ArrayList.
        List<String> names = new ArrayList<>();
        names.add("Holiday, Billie");
        names.add("Claudel, Camille");
        names.add("Picasso, Pablo");
        names.add("Galeen-Kallella, Akseli");
        names.add("Zotto, Osvaldo");
        names.add("Curry, Steph");
        names.add("Carney, Emily");
        names.add("TIller, Chyenne");
        names.add("Sackey-Mensah, Mariah");
        //POINT B: Use map and the toList collector to create an ArrayList of just
        //          the first names of the names ArrayList. Use a for loop to print
        //          out the names, separated by spaces.
        List<String> firstNamesList = names.stream()
                .map(n -> firstName(n))
                .collect(Collectors.toList());
                    System.out.println("First Name: ");
                for (String firstName : firstNamesList) {
                    System.out.print(firstName + " "); }
                    System.out.println();
                //POINT C: Use map and the joining collector to create a String of just
        //          the first names of the names ArrayList with each name separated
        //          by a coma. Print it.
        String firstNames = names.stream()
                .map(n -> firstName(n))
                .collect(Collectors.joining(", "));
        System.out.println("First Names: " + firstNames);
        //POINT D: By analogy from point C, print a comma-separated list of the
        //         last names in the names ArrayList.
        String lastNames = names.stream()
                .map(n->lastName(n))
                .collect(Collectors.joining(", "));
        System.out.println("Last Names: " + lastNames);
        //POINT E: Print a comma-separated list of all uppercase first names
        //         from the list of names in the names ArrayList.
        String upperCaseFirstNames = names.stream()
                .map(n -> firstName(n))
                .map(n -> n.toUpperCase())
                .collect(Collectors.joining(", "));
        System.out.println("UpperCase First Names: " + upperCaseFirstNames);
        //POINT F: Print a comma-separated list of all hyphenated last names
        //         from the list of names in the names ArrayList.
        String hyphenated = names.stream()
                .map(n -> lastName(n))
                .filter(n->n.contains("-"))
                .collect(Collectors.joining(", "));
        System.out.println("All Hyphenated Last Names: " + hyphenated);

        //POINT G: Print the integer value of the total length
        //         of all names in the names ArrayList.
        int totalLength = names.stream()
                .map(n -> n.length())
                .reduce(0, (n1, n2) -> n1 + n2);
        System.out.println("Total Length:" + totalLength);

        //POINT H: Print the integer value of the total length of all
                  //         first names in the names ArrayList.
        int firstNameLength = names.stream()
                .map(n -> firstName(n))
                .map(n -> n.length())
                .reduce(0, (n1, n2) -> n1 + n2);
        System.out.println("The Length Of The First Name:" + firstNameLength);

        //POINT I: Print the integer value of the product of the length of
        //         all first names in the names ArrayList.
        int productLength = names.stream()
                .map(n -> firstName(n))
                .map(n -> n.length())
                .reduce(1, (n1, n2) -> n1 * n2);
        System.out.println("The Product Of The Length Of All First Names: " + productLength);
    }

    private static String firstName(String directoryStyleName) {
        return (directoryStyleName.substring(directoryStyleName.lastIndexOf((" "))));
    }
    private static String lastName(String directoryStyleName) {
        return (directoryStyleName.substring(0,directoryStyleName.lastIndexOf((","))));
    }
    private static List<String> hyphenatedNames(List<String> names) {
        List<String> hyphenateds = new ArrayList<>();
        for (String name : names) {
            if (name.contains("-")) {
                hyphenateds.add(name);
            }
        }
        return hyphenateds;
    }

}