StreamArrayListProcessing.java
 /*  
  a program to perform some basic operations on a list of Strings using Java streams. 
  */

 package arraylists;

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

 public class StreamArrayListProcessing {
     public static void main(String[] args){
         List<String> names = new ArrayList<>();
         names.add("Holiday, Billie");
         names.add("Claudel, Camille");
         names.add("Picasso, Pablo");
         names.add("Gallen-Kallela, Akseli");
         names.add("Zotto, Osvaldo");
         names.add("McCall, Scott");
         names.add("Sawayama, Rina");
         names.add("Burgos, Kabir");

         List<String> firstNamesList = names.stream()
                 .map(n -> firstName(n))
                 .collect(Collectors.toList());

         System.out.print("First names: ");
         for (String firstName : firstNamesList){
             System.out.print(firstName + " ");
         }
          System.out.println();

         String firstNames = names.stream()
                 .map(n -> firstName(n))
                 .collect(Collectors.joining(", "));

         System.out.println("First names: " + firstNames);

         String lastNames = names.stream()
                 .map(n -> lastName(n))
                  .collect(Collectors.joining(", "));

         System.out.println("Last names: " + lastNames);

         String upperCaseFirstNames = names.stream()
                 .map(n -> firstName(n))
                 .map(n -> n.toUpperCase())
                 .collect(Collectors.joining(", "));

         System.out.println("Uppercase first names: " + upperCaseFirstNames);

         String hyphenatedLastNames = names.stream()
                 .map(n -> lastName(n))
                 .filter(n -> n.contains("-"))
                 .collect(Collectors.joining(", "));

         System.out.println("Hyphenated last names: " + hyphenatedLastNames);

         int totalLength = names.stream()
                 .map(n -> n.length())
                 .reduce(0, (n1, n2) -> n1 + n2);

         System.out.println("Total length: " + totalLength);

          int totalFirstsLength = names.stream()
                  .map(n -> firstName(n))
                  .map(n -> n.length())
                  .reduce(0, (n1, n2) -> n1 + n2);

          System.out.println("Total firsts length: " + totalFirstsLength);

          int namesProduct = names.stream()
                  .map(n -> n.length())
                   .reduce(1, (n1, n2) -> n1 * n2);

          System.out.println("Names product: " + namesProduct);
      }

      private static String firstName(String directoryStyleName) {
          int cp = directoryStyleName.indexOf(", ");
          int last = directoryStyleName.length();
          String first = directoryStyleName.substring(cp+2,last);
          return first;
     }

     private static String lastName(String directoryStyleName) {
         int cp = directoryStyleName.indexOf(", ");
          String last = directoryStyleName.substring(0,cp);
         return last;
     }
 }