为什么Collections实用程序类在Java中没有Iterator方法?

时间:2013-11-05 20:50:40

标签: java list collections iterator set

Collections实用程序类static methodscollection进行操作。例如, Collections.Sort(list)对列表进行排序。

为什么不是类型

的方法
static <T> Iterator<T> iterator() { }

通过这种方式,我可以在我的集合中获得一个迭代器

Iterator it = Colletions.iterator(list)

收藏集确实有emptyIterator() and emptyListIterator(),但我不明白他们的目的是什么?

4 个答案:

答案 0 :(得分:2)

它不需要迭代器方法,因为它已在Collection Interface中定义。它需要如此,因为对于不同的Collection类,即使它们提供相同的功能(外部),迭代器也不能(内部)工作。

[EDIT。谢谢,Marko。]空迭代器允许您编写更清晰的代码,无需覆盖特殊边缘情况,并且只有单向来提供空迭代器。因此,它在Collections类中定义了它的预定义行为。

答案 1 :(得分:2)

不需要Collections.iterator(Collection)方法,因为Collection接口的iterator()方法已经返回Iterator。只有Collection已经存在且IteratorCollection相关联才有意义。 Collections.iterator(Collection c)会做什么?它可能只会调用return c.iterator();

我认为Collections.emptyIterator()Collections.emptyListIterator()会向调用者保存创建空Collection / List的处理,只是为了调用iterator() / {{1}方法。

GRASP pattern "Information Expert"表示listIterator()的设计与其迭代的类有关,因为类本身具有创建Iterator所需的信息。

答案 2 :(得分:1)

但我们有Collection.iterator(),这正是您正在寻找的。

Collections类包含一组对所有类型集合都是通用的实用程序方法,而实现Collection接口的所有集合都包含给定功能的特定实现。

因为每个Collection已经有了自己的迭代器,所以将它作为Collections中的实用方法没有意义,除了它实现起来很简单:只返回调用的结果iterator()上的Collection方法作为参数收到。

答案 3 :(得分:1)

我只回答空迭代器&#34;的目的。一部分。

考虑这种方法:

boolean containsEvil(String x) {
  return x.contains("evil");
}

对于null参数,此方法将失败,这是它的边缘情况,并且需要特殊处理以避免失败。但是,如果你在程序的其余部分中注意不要使用null参数并表示&#34;没有字符串&#34;的概念。作为空字符串,您不需要处理特殊情况。

有时您可能还有一个基于Iterator的API:

boolean containsEvil(Iterator<String> xs) {
   while (xs.hasNext()) if (containsEvil(xs.next()) return true;
   return false;
}

同样,对于null参数,这将失败,因此您需要一个空迭代器工厂来代表&#34; no iterator&#34;案件。从更广泛的角度来说,您希望在迭代器空间中使用零元素,就像在字符串空间中一样。