Iterables为getLast
提出了两种方法
public static <T> T getLast(Iterable<T> iterable);
public static <T> T getLast(Iterable<T> iterable, @Nullable T defaultValue);
但只有一个为getFirst
public static <T> T getFirst(Iterable<T> iterable, @Nullable T defaultValue);
是否存在破坏对称性的设计/实施原因?
我认为重点是没有理由让getFirst(iterable)
可以用iterable.iterator().next()
完成。 Guava做了一个很好的尝试,以保持API小,因此不添加可以/应该以另一种方式轻松完成的事情。
另一方面,还没有一种机制来测试iterable是否为空,如果是,则返回默认值而不是第一个值。因此,getFirst(iterable, default)
。
此外,没有一种简单的方法来获得最后一个元素,因此getLast(iterable)
和getLast(iterable, default)
作为@ JohnB答案的补充,我想展示Guava's devs opinion about getFirst(iterable)
。 Kevin Bourrillion(负责人Guava的开发)在那里写道:
iterable.iterator()。next()非常清晰,可读且明确。我确切地知道它的作用,而使用Iterators.getFirst(),我必须跑掉并查看该库设计师如何决定这样做。
而且,你的一致性概念是非常错误的。我们在如何呈现重要功能时使用一致性,但我们从不使用它来证明添加无用的功能,并且您也不应该在自己的库中!
所以,你有一个选择:
iterable.iterator().next()
,Iterables.getFirst(Iterable<T> iterable, T default)
,Iterables.get(Iterable<T>, 0)
,iterable.iterator().next()
和一些文档)并将其用作Iterables2.getFirst(iterable)
,PS:前段时间我有类似的疑问,当时发现了exact duplicate of this question。