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

Sta*_*lin 36 java collections iterable api-design guava

Iterables提供了两种方法getLast

 public static <T> T getLast(Iterable<T> iterable);
 public static <T> T getLast(Iterable<T> iterable, @Nullable T defaultValue);
Run Code Online (Sandbox Code Playgroud)

但只有一个 getFirst

 public static <T> T getFirst(Iterable<T> iterable, @Nullable T defaultValue);
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*n B 38

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

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

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

  • 我经常被'Iterables.getFirst()`的缺席所困扰.然后我仔细检查并使用`Iterables.get(iterable,0)`.我认为`Iterables.getFirst()`会看起来更干净,但是哦...... (3认同)
  • `next()`的替代方法是`get(iterable,0)`. (2认同)

Xae*_*ess 22

作为@ 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:前段时间我有类似的疑问,当时发现了这个问题的确切复制品.

  • 我会等你的.:-) (6认同)
  • 谢谢你的链接.我相信我们应该等凯文改变主意. (3认同)