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

2022-09-01 01:02:59

迭代器提出了两种方法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);

是否有任何设计/实现原因来破坏对称性?


答案 1

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

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

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


答案 2

作为@JohnB答案的补充,我想展示Guava的开发人员对getFirst(可迭代)的看法。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:我前段时间也有类似的疑问,当时发现了这个问题的完全重复