43

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?

4

2 回答 2

42

我认为关键是没有理由 agetFirst(iterable)因为这可以用iterable.iterator().next(). Guava 做了一个很好的尝试来保持 API 很小,因此没有添加可以/应该以另一种方式轻松完成的事情。

另一方面,目前还没有一种机制来测试可迭代对象是否为空,如果是则返回默认值而不是第一个值。因此,getFirst(iterable, default)

此外,没有一种简单的方法来获取最后一个元素,因此getLast(iterable)getLast(iterable, default)

于 2011-12-12T11:54:33.080 回答
23

作为@JohnB 回答的补充,我想向Guava 展示开发人员对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()和一些文档)并将其用作 ie Iterables2.getFirst(iterable)
  • 等待凯文改变主意;)

PS:我前段时间有类似的疑问,当时发现这个问题的完全重复

于 2011-12-12T17:02:07.443 回答