为什么没有getFirst(可迭代)方法?

时间:2011-12-12 11:48:28

标签: java collections guava api-design iterable

IterablesgetLast

提供了两种方法
 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);

是否存在破坏对称性的设计/实施原因?

2 个答案:

答案 0 :(得分:38)

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

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

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

答案 1 :(得分:21)

作为@ 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