Why does Iterables.find() in Guava throw NoSuchElementException, instead of returning null?

Enno Shioji picture Enno Shioji · Jun 23, 2010 · Viewed 8.2k times · Source

I love Google Guava and use it a lot, but there is one method I always find me writing..

 public static <T> T tryFind(Iterable<T> iterable, Predicate<T> predicate){
     for(T t : iterable){
         if(predicate.apply(t)){
              return t;
         }
     }
     return null;
  }

To me this seems to be a very useful addition to Iterables (also to Iterators for that matter), so I'm wondering why it's missing. Also, while I can see the point of having a method that throws NoSuchElementException, perhaps to distinguish between finding a null and not finding the element, that situation only comes up if the predicate you are using is

public boolean apply(T t){
     return t==null;
}

which doesn't seem to be a common case.

So why did guava designers chose to have this behavior, instead of just returning null if it can't find it?

Here is the javadoc for [Iterables.find()][1]

[1]: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#find(java.lang.Iterable, com.google.common.base.Predicate)

Answer

Kevin Bourrillion picture Kevin Bourrillion · Jun 23, 2010

We're adding another overload of find() which accepts a default value.