Due to the print book page limit, we cannot inlcude all good CheckPoint questions in the physical book. The CheckPoint on this Website may contain extra questions not printed in the book. The questions in some sections may have been reordered as a result. Nevertheless, it is easy to find the CheckPoint questions in the book on this Website. Please send suggestions and errata to Dr. Liang at y.daniel.liang@gmail.com. Indicate the book, edition, and question number in your email. Thanks!

Chapter 30 Check Point Questions

Section 30.1
30.1.1
What are the benefits of using aggregate operations on collection streams for processing data?
Section 30.2
30.2.1
Show the output of the following code?
Character[] chars = {'D', 'B', 'A', 'C'};
System.out.println(Stream.of(chars).sorted().findFirst().get());
System.out.println(Stream.of(chars).sorted(
  java.util.Comparator.reverseOrder()).findFirst().get());
System.out.println(Stream.of(chars)
  .limit(2).sorted().findFirst().get());
System.out.println(Stream.of(chars).distinct()
  .skip(2).filter(e -> e > 'A').findFirst().get());
System.out.println(Stream.of(chars)
  .max(Character::compareTo).get());
System.out.println(Stream.of(chars)
  .max(java.util.Comparator.reverseOrder()).get());
System.out.println(Stream.of(chars)
  .filter(e -> e > 'A').findFirst().get());
System.out.println(Stream.of(chars)
  .allMatch(e -> e >= 'A'));
System.out.println(Stream.of(chars)
  .anyMatch(e -> e > 'F'));
System.out.println(Stream.of(chars)
  .noneMatch(e -> e > 'F'));
Stream.of(chars).map(e -> e + "").map(e -> e.toLowerCase())
  .forEach(System.out::println);

Object[] temp = Stream.of(chars).map(e -> e + "Y")
  .map(e -> e.toLowerCase()).sorted().toArray();
System.out.println(java.util.Arrays.toString(temp));
30.2.2
What is wrong in the following code?
Character[] chars = {'D', 'B', 'A', 'C'};
Stream<Character> stream = Stream.of(chars).sorted();
System.out.println(stream.findFirst());
System.out.println(stream.skip(2).findFirst());
30.2.3
Rewrite (a) using a method reference and an anonymous inner class and (b) using lambda expression and an anonymous inner class.
(a) sorted((s1, s2) -> s1.compareToIgnoreCase(s2))
(b) forEach(System.out::println)
30.2.4
Given a map of the type Map<String, Double>, write an expression that returns the sum of all the values in map. For example, if the map contains {"john", 1.5} and {"Peter", 1.1}, the sum is 2.6.
Section 30.3
30.3.1
Show the output of the following code?
int[] numbers = {1, 4, 2, 3, 1};
System.out.println(IntStream.of(numbers)
  .sorted().findFirst().getAsInt());
System.out.println(IntStream.of(numbers)
  .limit(2).sorted().findFirst().getAsInt());
System.out.println(IntStream.of(numbers).distinct()
  .skip(1).filter(e -> e > 2).sum());
System.out.println(IntStream.of(numbers).distinct()
  .skip(1).filter(e -> e > 2).average().getAsDouble());
System.out.println(IntStream.of(numbers).max().getAsInt());
System.out.println(IntStream.of(numbers).max().getAsInt());
System.out.println(IntStream.of(numbers)
  .filter(e -> e > 1).findFirst().getAsInt());
System.out.println(IntStream.of(numbers)
  .allMatch(e -> e >= 1));
System.out.println(IntStream.of(numbers)
  .anyMatch(e -> e > 4));
System.out.println(IntStream.of(numbers).noneMatch(e -> e > 4));
IntStream.of(numbers).mapToObj(e -> (char)(e + 50))
  .forEach(System.out::println);

Object[] temp = IntStream.of(numbers)
  .mapToObj(e -> (char)(e + 'A')).toArray();
System.out.println(java.util.Arrays.toString(temp));
30.3.2
What is wrong in the following code?
int[] numbers = {1, 4, 2, 3, 1};  
DoubleSummaryStatistics stats = 
  DoubleStream.of(numbers).summaryStatistics();
System.out.printf("The summary of the stream is\n%-10s%10d\n" +
  "%-10s%10.2f\n%-10s%10.2f\n%-10s%10.2f\n%-10s%10.2f\n",
  "  Count:", stats.getCount(), "  Max:", stats.getMax(),
  "  Min:", stats.getMin(), "  Sum:", stats.getSum(),
  "  Average:", stats.getAverage());
30.3.3
Rewrite the following code that maps an int to a Character using an anonymous inner class?
mapToObj(e -> (char)(e + 50))
30.3.4
Show the output of the following code.
int[][] m = {{1, 2}, {3, 4}, {5, 6}};
System.out.println(Stream.of(m)
  .mapToInt(e -> IntStream.of(e).sum()).sum());
30.3.5
Given an array names in Listing 30.1, write the code to display the total number of characters in names.
Section 30.4
30.4.1
What is a stateless method? What is a stateful method?
30.4.2
How do you create a parallel stream?
30.4.3
Suppose names is a set of strings, which of the following two streams is better?
Object[] s = set.parallelStream().filter(e -> e.length() > 3)
  .sorted().toArray();

Object[] s = set.parallelStream().sorted()
  .filter(e -> e.length() > 3).toArray();
30.4.4
What will be the output of the following code?
int[] values = {3, 4, 1, 5, 20, 1, 3, 3, 4, 6};
System.out.print("The values are ");
  IntStream.of(values)
    .forEach(e -> System.out.print(e + " "));
30.4.5
What will be the output of the following code?
int[] values = {3, 4, 1, 5, 20, 1, 3, 3, 4, 6};
System.out.print("The values are ");
  IntStream.of(values).parallel()
    .forEach(e -> System.out.print(e + " "));
30.4.6
Write a statement to obtain an array of 1000 random double values between 0.0 and 1.0, excluding 1.0.
Section 30.5
30.5.1
Show the output of the following code.
int[] values = {1, 2, 3, 4};
System.out.println(IntStream.of(values)
  .reduce(0, (e1, e2) -> e1 + e2));
System.out.println(IntStream.of(values)
  .reduce(1, (e1, e2) -> e1 * e2));
System.out.println(IntStream.of(values).map(e -> e * e)
  .reduce(0, (e1, e2) -> e1 + e2));
System.out.println(IntStream.of(values).mapToObj(e -> "" + e)
  .reduce((e1, e2) -> e1  + " " + e2).get());    
System.out.println(IntStream.of(values).mapToObj(e -> "" + e)
  .reduce((e1, e2) -> e1  + ", " + e2).get());      
30.5.2
Show the output of the following code.
int[][] m = {{1, 2}, {3, 4}, {5, 6}};
System.out.println(Stream.of(m)
  .map(e -> IntStream.of(e).reduce(1, (e1, e2) -> e1 * e2))
  .reduce(1, (e1, e2) -> e1 * e2));
30.5.3
Show the output of the following code.
int[][] m = {{1, 2}, {3, 4}, {5, 6}, {1, 3}};
Stream.of(m).map(e -> IntStream.of(e))
  .reduce((e1, e2) -> IntStream.concat(e1, e2))
  .get().distinct()
  .forEach(e -> System.out.print(e + " "));
30.5.4
Show the output of the following code.
int[][] m = {{1, 2}, {3, 4}, {5, 6}, {1, 3}};
System.out.println(
  Stream.of(m).map(e -> IntStream.of(e))
    .reduce((e1, e2) -> IntStream.concat(e1, e2))
    .get().distinct().mapToObj(e -> e + "")
    .reduce((e1, e2) -> e1 + ", " + e2).get());
Section 30.6
30.6.1
Show the output of the following code.
int[] values = {1, 2, 3, 4, 1};
List<Integer> list = IntStream.of(values).mapToObj(e -> e)
  .collect(Collectors.toList());
System.out.println(list);

Set<Integer> set = IntStream.of(values).mapToObj(e -> e)
  .collect(Collectors.toSet());
System.out.println(set);

Map<Integer, Integer> map = IntStream.of(values).distinct()
  .mapToObj(e -> e)
  .collect(Collectors.toMap(e -> e, e -> e.hashCode()));
System.out.println(map);

System.out.println(
  IntStream.of(values).mapToObj(e -> e)
    .collect(Collectors.summingInt(e -> e)));

System.out.println(
  IntStream.of(values).mapToObj(e -> e)
    .collect(Collectors.averagingDouble(e -> e)));
Section 30.7
30.7.1
Show the output of the following code.
int[] values = {1, 2, 2, 3, 4, 2, 1};
IntStream.of(values).mapToObj(e -> e).collect(
  Collectors.groupingBy(e -> e, TreeMap::new,
    Collectors.counting())).
  forEach((k, v) -> System.out.println(k + " occurs " + v
      + (v > 1 ? " times " : " time ")));

IntStream.of(values).mapToObj(e -> e).collect(
  Collectors.groupingBy(e -> e, TreeMap::new,
    Collectors.summingInt(e -> e))).
  forEach((k, v) -> System.out.println(k + ": " + v));

MyStudent[] students = {
  new MyStudent("John", "Johnson", "CS", 23, 89.2),
  new MyStudent("Susan", "Johnson", "Math", 21, 89.1),
  new MyStudent("John", "Peterson", "CS", 21, 92.3),
  new MyStudent("Kim", "Yao", "Math", 22, 87.3),
  new MyStudent("Jeff", "Johnson", "CS", 23, 78.5)};

Stream.of(students)
  .sorted(Comparator.comparing(MyStudent::getLastName)
    .thenComparing(MyStudent::getFirstName))
  .forEach(e -> System.out.println(e.getLastName() + ", " +        
                e.getFirstName()));

Stream.of(students).collect(Collectors.
  groupingBy(MyStudent::getAge, TreeMap::new,
    Collectors.averagingDouble(MyStudent::getScore))).
  forEach((k, v) -> System.out.printf("%10s%10.2f\n", k, v));
Section 30.8
30.8.1
Can the following code be used to replace line 19 in Listing 30.7?
DoubleStream.of(numbers).filter(e -> e >          
  DoubleStream.of(numbers).average()).count());
30.8.2
Can the following code be used to replace lines 15-16 in Listing 30.8?
Stream.of(chars).forEach(e -> {
  int count = 0;
  System.out.print(e + (++count % 20 == 0 ? "\n" : " ")); });
30.8.3
Show the output of the following code?
String s = "ABC"; 
Stream.of(s.toCharArray()).forEach(ch -> 
  System.out.println(ch));
30.8.4
Show the output of the following code? (The toCharacterArray method is presented in Listing 30.9)
String s = "ABC"; 
Stream.of(toCharacterArray(s.toCharArray())).forEach(ch -> 
  System.out.println(ch));
30.8.5
Write the code to obtain a one-dimensional array list of strings from a two-dimensional array matrix of strings.