为啥没有 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<T> iterable, T default)
,
使用Iterables.get(Iterable<T>, 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) 方法?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我得到 AttributeError:'LinearRegressionGD' 对象没有属性 'n_iter'
java Iterable接口为啥不能带泛型通配符?或者:为啥我不能重写 iterator() 方法为子类返回一个 Iterator?