3 Apr 2011

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.