views:

117

answers:

4

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)

+5  A: 

Likely because null is a valid return value. Generally speaking, unless there is a good reason to not support null then it should be supported. If it is supported then you have to handle the case where it exists.

TofuBeer
+1  A: 

Instead of tryFind() you can use filter and check if it returns an empty collection.

I found that always working with collections is cleaner than directly asking objects.

Peter Tillemans
Hm, but then you'll be iterating twice, right? I can see it is cleaner, but..
Enno Shioji
In many cases the check is then no longer needed and you can immediately iterate over the results. Nothing will happen when there are no results, which is in my experience often is the desired behavour.
Peter Tillemans
+7  A: 

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

Kevin Bourrillion
Thanks for the great work, Kevin!
Enno Shioji
+1  A: 

In my opinion, the NoSuchElementException is better than a late and very difficult to debug NPE... In most cases, when you are searching an object in a "collection", you know that you would probably find it. If the object you're looking for is not in the "collection", you're facing an exceptional case... According to me, the NoSuchElementException feedback is more explicit than the meaningless "null".

The default value which will be introduced in a future guava release would be an efficient shortcut to treat the exceptionnal case.

Sylvain M