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

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

===============>>#1 票数:38 已采纳

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

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

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

===============>>#2 票数:21

作为@ 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()和一些文档)并将其用作Iterables2.getFirst(iterable)
  • 等待凯文改变主意;)

PS:前段时间我有类似的疑问,当时发现了这个问题的确切复制品

  ask by Stan Kurilin translate from so

未解决问题?本站智能推荐:

1回复

快速获取两个有序可迭代对象的通用项的方法?

如何获得两个有序可迭代对象的通用项? 是否有来自Apache Commons或Guava的任何库方法,或使用快速算法的任何此类库方法?
1回复

番石榴连接器为什么要实现一个可迭代的私有方法(首先是最终对象,最后是最终对象,最后是Object []其余)?

作者的目的是什么? 我猜他想利用编译器生成的数组,而不是新建一个ArrayList。 但仍然是一个令人困惑的问题,为什么不写如下呢?
2回复

Java /番石榴-在迭代器/迭代器的某些索引处开始和停止

我正在寻找一种可能与Guava一起包装Iterable / Iterator的优雅方法,以使新的Iterable / Iterator 从某个索引开始 停在某个指数。 番石榴似乎具有限制输入的功能( http://docs.guava-libraries.googlec
1回复

Guava Iterables concat实现不能与Java 8中添加的新Iterable API方法一起使用?

我想要一种简单的方法来制作Iterables concat,所以我在Spring MVC代码(Spring 4.2.1)中尝试了Guava Iterables(19 RC1)。 我有两个来自Spring Data JPA的可迭代项。 例如 然后我做一个concat: 但是
3回复

为什么迭代器方法同时存在于Iterable和Collection接口中? [重复]

这个问题在这里已有答案: 方法iterator()在java.util.Collection和java.lang.Iterable中声明,它的超级接口? 1个答案 Iterable接口具有以下方法: Collection接口扩展了Iterable ,它也声
2回复

为什么选择迭代器 如果iterator()已在Iterable中,则将其放入Collection,AbstractCollection中。

这个问题已经在这里有了答案: 为什么在java.util.Collection上有方法iterator() 4个答案 当将Iterator iterator()放入Iterable接口中,并由Collection接口和AbstractCollection接口进行扩展
1回复

如何创建仅接受实现Iterable的元素的方法

我想编写一个函数printAll(),该函数仅接受那些实现了Iterable的元素,以便我可以对其进行迭代并打印这些元素。 我怎么做?
2回复

为什么我的Iterator的方法无法解决?

我在用Java做List集合的“装饰器”。 Sth是错误的,我不知道它是什么。 这是我的代码和观察到的错误。 1. myListContainer.java 2. Client.java (psvm) 和一个问题 问题: 1. test.iterator()。ha
5回复

包含Iterable和Iterator的方法?

是否有一个简单的方法来检查元素是否包含在迭代或迭代器中,类似于Collection.contains(Object o)方法? 即不必写: 我想写: 我真的很惊讶没有这样的事情。
3回复

Java实现Iterable,针对每个和方法

我在本练习中使用了要实现的算法。 我有这个主要的: 如果我将“ a.contacts()”替换为“ a”并使用此类,则代码有效! 但是,如何使用“ a.contacts()”实现for-each循环? 谢谢