jeanne’s java 8 upgrade exam experience

On Friday, I took the Java 8 Upgrade exam beta.

As I did with the OCPJP 7 and OCAJP 8I’m going to take a stab at guessing my score. I’ll edit this post when I know my actual score.  I think I got between 75% and 85%.
I got a 66% on the upgrade exam, but an 88% on the full exam which I more prepared for. (passing is 65% so I barely passed) I think I was overconfident. As I gained more experience (after the exam) both through using Java 8 and writing the chapters for our OCP book, I realized the topic was far deeper than I realized when studying for the exam. Also, I spent a lot of time studying Nashorn which I didn’t know at all before the objectives came out. Didn’t get any questions wrong on that. I also had mis-read the date/time objectives and didn’t know a good number of the APIs when taking the exam. Know them now!

How did I study?

Topic How studied
Inner classes Re-read that Advanced Class design chapter in the draft version of our OCP book. Also re-read the draft of our section on effectively final
Lambdas/filtering/collections/streams Re-read the parts of the functional programming chapter I had drafted along with my outline for the rest. (This is a big chapter and it isn’t finished yet. We do have the key points listed though which shows what to study/look for)My favorite book for learning these topics in the first place is Java 8 for the Really Impatient. Also Java 8 New Features is good. I also used the lambda tutorial to learn from originally.I’ve been doing a good bit of functional programming in Groovy in addition to learning lambdas deeply for Java. I felt prepared for this part of the exam. Which is good because it is a large percentage of the exam.
Static/default methods on interfaces Read the sections on interfaces in our OCA book and re-did the mock questions.
Java 8 Date/Time API Read the sections on Java 8 Dates in our OCA book and re-did the mock questions.Note: I completely missed the fact that the upgrade exam covers ZonedDateTime (and daylight savings time.) This is not on the OCA and therefore not in our OCA book. If you aren’t from the US, I recommend remembering that in the US, we move the clocks forward one hour (there is no 2-2:59am) on one day in the spring and backward one hour (2am occurs twice) on one day in the fall.I hope they don’t put this on the OCP exam. I don’t think something that requires this knowledge of how United States daylight savings time works belongs on the exam.
Nashorn Unlike lambdas, my experience with Nashorn is that I read a chapter on it in Java 8 for the Really Impatient. When I found out it was on the upgrade exam, I started learning it more deeply. I didn’t think they were going to put it on the exam. It’s not a major part of the language.Anyway, I wrote up the key points for the chapter before taking the exam. This turned out to be good preparation.I have coded in JavaScript. Which helped with one question, but wasn’t a major contributor to getting these questions right on the exam.I also used the API from the tutorial along with the shell tutorial. (the shell scripting parts aren’t on the exam – the objectives don’t say they are, but I was skeptical. Glad to see they scoped this down at least).

And of course, I wrote a bunch of practice code.

Test day

The objectives list the beta as being 150-225 minutes. (quite the range.) That’s 2.5 to 3.75 hours. My exam was 3 hours. (I’m glad I didn’t get an even longer one. Three hours is a long time to sit!) In my three hour window I got 126 questions to answer. It took me two hours to go through my first pass of answering each question. I had about 20 to go back to. One good thing about having so many questions is that sometimes a fact you don’t remember is answered in another question. That happened for a few of mine. After I finished going back to those 20, I called it done. I didn’t review the others because I was tired. Did I mention three hours is a long time?

When I took the OCAJP 8 beta, there was new functionality where you could right click an answer to cross it out (strikethrough) in the exam itself. It didn’t work at that point, but it does now. I really like this feature. It was nice to be able to mark off answers as I read. This also meant I had less to write down on the markerboard during the exam.

I even used the cross out feature for some questions that I wasn’t going back to. if I was thinking about “process of elimination” I used it. Or even if the answers were long. Or I had to choose the best two or three answers. It was nice to have less to remember in my head!

got my box of books

And even cooler than when I got to touch my book, Scott and I both got our author copies today.

book-box

I’ve certainly been enjoying showing it to everyone I know.

using Nashorn’s jjs for experimenting

In Java 8, Oracle introduced the new Nashorn engine and is encouraging the use of jjs. It’s a RPEL (read print evaluate loop) for JavaScript. Since JavaScript can call Java, this allows experimenting with Java APIs like you do in other languages like Python and Ruby. It works better in those languages though.

Cay Horstmann’s book, Java SE 8 for the Really Impatient, had good exercises for lambdas so I decided to the end of chapter exercises for Nashorn.

Exercise 1 – Play with jjs to experiment with an API you want to explore; did you find it easier than writing test programs in Java?

Nope. The so called advantage of using jjs is that you don’t need to write the plumbing code. But an IDE can generate a class and main method in a couple clicks.

  1. Strike 1 – With jjs, I need to type in the package of name of classes I want to use rather than just letting Eclipse deal with imports for me.
  2. Strike 2 – jjs doesn’t have tab complete (autocomplete) which means I have to type in the full class/method name of the class I am experimenting with. If I was an expert, I wouldn’t be in jjs in the first place.
  3. Strike 3 – jjs doesn’t support the up arrow. Which means when I make typos (see strike 1 and 2), I get to type the whole thing again.

Exercise 2 – Using JJS and the stream library iteratively work out a solution to the problem to print a filtered list of unique long words in sorted order and see how it compares to your usual workflow.

Here was my workflow with jjs:

  1. Create the test file in a text editor
  2. Run ./jjs
  3. Create a path object
    Attempt # Code Error Comments
    1 jjs> var paths = Paths.get(‘path/words.txt’) <shell>:1 ReferenceError: “Paths” is not defined Forgot to type the package name. Don’t know it by heart anyway. Need to look it up in the JavaDoc.
    2 jjs> var paths = java.nio.file.Paths.get(‘path/words.txt’) Success
  4. Read the file
    Attempt # Code Error Comments
    1 jjs> List<String> list = java.nio.files. Files.readAllLines(path) ECMAScript Exception: ReferenceError: <shell>:1:11 Invalid left hand side for assignment It’s JavaScript, not Java so no type declaration. Should just use var.
    2 jjs> var list = java.nio.files. Files.readAllLines(path)  <shell>:1 ReferenceError: “path” is not defined Typo in variable name. I wish I named it path, not paths. But I want to do the exercise in order and not go back.
    3 jjs> var list = java.nio.files. Files.readAllLines(paths) java.lang.RuntimeException: java.lang. ClassNotFoundException: java.nio.files. Files.readAllLines Typo in package name. It should be file and not files
    4 jjs> var list = java.nio.file. Files.readAllLines(paths) java.lang.RuntimeException: java.nio.file. NoSuchFileException: path/words.txt Missing forward slash in path name. On the bright side, I can rename the variable without feeling like I’m messing up the experiment.
    5 jjs> var path = java.nio.file. Paths.get(‘/path/words.txt’) Worked as expected (but at this point, I’m typing into this blog post and copy/pasting into the jjs console
    6 jjs> var list = java.nio.file. Files.readAllLines(paths)  java.lang.RuntimeException: java.nio.file. NoSuchFileException: path/words.txt Sigh. Didn’t use the corrected variable name
    7 var list = java.nio.file. Files.readAllLines(path) Worked as expected
  5. Filter the long words
    Worked.

    Attempt # Code Error Comments
    1 jjs> list.stream().grep({ l -> l.length() > 12}) ECMAScript Exception: SyntaxError: <shell>:1:23 Expected : but found – This is completely wrong. Aside from the stream() call, it is using Groovy syntax. (I code Groovy at a command line so my fingers started there)
    2 jjs> list.stream().filter( l -> l.length() > 12) ECMAScript Exception: SyntaxError: <shell>:1:30 Expected an operand but found Hmm. Puzzled. it looks right this time. I copy/pasted into my IDE and it compiled. I then started searching online and found out that you have to use a function literal. (This was in the book. I forgot about it)
    3 jjs> list.stream().filter(function(e) { return e.length() > 12 }) Prints reference to stream (as does Java.) Now can add the print
    4 jjs> list.stream().filter(function(e) { return e.length() > 12 }).forEach(System.out::println) ECMAScript Exception: SyntaxError: <shell>:1:79 Expected , but found : Not surprised that :: doesn’t work since -> doesn’t. Now for the long way.
    5 jjs> list.stream().filter(function(e) { return e.length() > 12 }).forEach(function(e) { print(e) }) Works as expected
  6. Add sorting, uniqueness and refactor
    Attempt # Code Error Comments
    1 jjs> list.stream().filter(function(e) { return e.length() > 12 }).sorted().forEach(function(e) { print(e) }) Sorting worked
    2 jjs> list.stream().filter(function(e) { return e.length() > 12 }).sorted().distinct().forEach(function(e) { print(e) }) Uniqueness filter worked
    3 jjs> list.stream().filter(function(e) e.length() > 12 ).sorted().distinct().forEach(function(e)  print(e) ) Remove unneeded code

 My thoughts

That was so far away from being easier that it was ridiculous.  I’m comfortable with the NIO and lambda APIs. This shouldn’t have been hard. The Java version is:

import java.io.*;
import java.nio.file.*;
import java.util.*;

public class Exercise2 {
   public static void main(String[] args) throws IOException {
      Path path = Paths.get("/path/words.txt");
      List<String> list = java.nio.file.Files.readAllLines(path);
      list.stream()
                .filter(l -> l.length() > 12)
                .sorted()
                 .distinct()
		.forEach(System.out::println);
     }
}