Option(null) is None

@wfaler asked:

Doing a presentation soonish on “Why #Scala” - have a truckload of arguments, but what are your arguments for Scala over Java? Give me ammo!

Ok, I’ll bite.  Here’s one of those every-day things I stop and notice from time-to-time. It’s not new, it’s not huge, it’s just one of the things that makes a difference when you’re trying to ship stuff.

The Google Java APIs for accessing Google contacts has you write code like this:

for (int i = 0; i < resultFeed.getEntries().size(); i++) {
  ContactEntry entry = resultFeed.getEntries().get(i);
  if (entry.hasName()) {
    Name name = entry.getName();
    if (name.hasFullName()) {
    ...

That’s how the “retrieving all contacts” example starts.  The basic pattern is: check if the property you want is available, then get it.

I recently had the need to go through contacts to extract birthdays.  I only care about contacts with a name and a birthday, but I use Scala so don’t have to do the if/get dance because Option does the right thing in a for-comprehension:

for { 
  entry     <- contacts
  name      <- Option(entry.getName)
  full_name <- Option(name.getFullName)
  birthday  <- Option(entry.getBirthday)
  when = birthday.getWhen 
} yield "%s: %s".format(full_name.getValue, when)

The above evaluates to a List[String] (because contacts starts as a List) containing those contacts with a name and a birthday.  So even when using regular Java libraries, you end with benefits (less code, more readable code, less-likely-to-cock-up-the-logic code) just by using Scala. IMHO.