Iterables present two methods for getLast
public static <T> T getLast(Iterable<T> iterable);
public static <T> T getLast(Iterable<T> iterable, @Nullable T defaultValue);
but only one for getFirst
public static <T> T getFirst(Iterable<T> iterable, @Nullable T defaultValue);
Is there are any design/implementation reason for breaking symmetry?
As an additions to @JohnB's answer I'd like to show Guava's devs opinion about
getFirst(iterable)
. Kevin Bourrillion (head Guava's dev) writes there:So, you have a choice:
iterable.iterator().next()
,Iterables.getFirst(Iterable<T> iterable, T default)
,Iterables.get(Iterable<T>, 0)
,iterable.iterator().next()
and some docs) and use it as i.e.Iterables2.getFirst(iterable)
,PS: I had similar doubt some time ago and found exact duplicate of this question at that time.
I think the point is that there is no reason for a
getFirst(iterable)
in that this could be done withiterable.iterator().next()
. Guava makes an excellent attempt to keep the API small and so does not add things that could / should be done easily another way.On the other hand, there is not already a mechanism to test if an iterable is empty and if so return a default value instead of the first value. Hence,
getFirst(iterable, default)
.Also, there is not a simple way to get the last element, hence
getLast(iterable)
andgetLast(iterable, default)