为啥没有 getFirst(iterable) 方法?

Posted

技术标签:

【中文标题】为啥没有 getFirst(iterable) 方法?【英文标题】:Why there is no getFirst(iterable) method?为什么没有 getFirst(iterable) 方法? 【发布时间】:2012-01-18 10:02:00 【问题描述】:

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);

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

【问题讨论】:

In Google Guava (Java), why are Iterables.getFirst() and getLast() are inconsistent?的可能重复 也许你可以使用Iterables.getOnlyElement @F***Zeindl - getOnlyElement 抛出 IllegalArgumentException 如果有多个元素。 getLast 不应该做这种事。 这就是为什么我的意思是“也许”-> 在某些情况下。 【参考方案1】:

作为对@JohnB 答案的补充,我想显示Guava's devs opinion about getFirst(iterable)。 Kevin Bourrillion(Guava 的负责人)在此写道:

iterable.iterator().next() 非常清晰易读, 明确。我确切地知道它的作用,而使用 Iterators.getFirst(),我必须跑过去看看那个库是如何工作的 设计师决定这样做。

此外,您的一致性概念被严重误导。我们用 我们如何呈现重要功能的一致性,但我们从不 用它来证明添加毫无价值的功能是合理的,你不应该 在你自己的图书馆里!

所以,你有一个选择:

使用iterable.iterator().next(), 使用Iterables.getFirst(Iterable&lt;T&gt; iterable, T default), 使用Iterables.get(Iterable&lt;T&gt;, 0), 编写自己的方法(可能包含iterable.iterator().next() 和一些文档)并将其用作Iterables2.getFirst(iterable), 等待凯文改变主意;)

PS:前段时间我也有类似的疑惑,当时找到exact duplicate of this question。

【讨论】:

感谢您的链接。我认为我们应该等待凯文改变主意。【参考方案2】:

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

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

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

【讨论】:

next() 的替代品是get(iterable, 0) 是的,但我一直使用 Iterable API 来说明为什么 Guava 没有添加 getFirst(iterable)。添加get(iterable, index) 并不是getFirst(iterable) 不存在的原因,因为get(iterable, index, default) 并没有阻止他们添加getFirst(iterable, default) 好点。实际上,我不认为番石榴是带有小 API 的库。只是因为有些方法只是复制标准的方法,比如Doubles.compare。并考虑到@Daniel Fischer 的观点,我相信应该提供其他一些原因。 我经常被Iterables.getFirst() 的缺席所困扰。然后我仔细检查并使用Iterables.get(iterable, 0)。我认为Iterables.getFirst() 看起来会更干净,但是哦,好吧...... 我们确实努力保持 API 非常小,据我所知,这就是没有 Iterables.getFirst 的动机。我真的很震惊 Doubles.compare 在那里,我现在要提出一个问题......

以上是关于为啥没有 getFirst(iterable) 方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java中的String类没有实现Iterable?

为啥我得到 AttributeError:'LinearRegressionGD' 对象没有属性 'n_iter'

为啥 BitSet 不可迭代?

java Iterable接口为啥不能带泛型通配符?或者:为啥我不能重写 iterator() 方法为子类返回一个 Iterator?

java基础09-集合类

c++11中,为啥可以用const_iterator删除map/multimap中的元素