【问题标题】:why does the Collections utility class does not have a Iterator method in Java?为什么 Collections 实用程序类在 Java 中没有 Iterator 方法?
【发布时间】:2013-11-16 21:36:23
【问题描述】:

Collections 实用程序类具有在collection 上运行的static methods。例如, Collections.Sort(list) 对列表进行排序。

为什么不是类型的方法

static <T> Iterator<T> iterator() { }

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

Iterator it = Colletions.iterator(list)

集合确实有emptyIterator() and emptyListIterator(),但我不明白它们的用途是什么?

【问题讨论】:

  • list.iterator() 没有达到您的目的吗?
  • 一个更好的问题是为什么 List 没有 sort() 方法。答案是在 Java 8 中它会。理想情况下,您一开始就不需要 Collections 类。

标签: java list collections iterator set


【解决方案1】:

我将只回答“空迭代器的目的”部分。

考虑这种方法:

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

此方法将因空参数而失败,这是它的边缘情况,需要特殊处理以避免失败。但是,如果您在程序的其余部分中注意不要使用 null 参数并将“无字符串”的概念表示为 空字符串,则不需要处理特殊情况.

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

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

再一次,这会因为空参数而失败,所以你需要一个 empty iterator 工厂来代表“无迭代器”的情况。更广泛地说,您希望零元素在迭代器空间中,就像在字符串空间中一样。

【讨论】:

  • 有趣。但是没有空检查吗? if(arg!=null){/**/} ?
  • 是的,空值检查是我所说的“特殊处理”,我的回答是你想避免它们,因为它们会污染代码,带有冗余、样板和分散注意力构造。
  • 那么...您是否建议避免故障安全,而是在其余代码中使用空列表/迭代器/字符串?如果有人忘记或犯了错误,就会导致程序崩溃……
  • 是的,错误是由崩溃支付的。这比沉默的虫子要好。
  • Touché :) “尽早大声失败”。得分。
【解决方案2】:

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

[编辑。谢谢,Marko。] 空迭代器允许您编写更简洁的代码,无需覆盖特殊的边缘情况,并且只有 一种方法 可以提供空迭代器。因此,它是在具有预定义行为的 Collections 类中定义的。

【讨论】:

  • 空迭代器的使用应该很明显:它相当于一个空列表,或者更广泛地说,相当于迭代器空间中的“零”元素。它允许您编写更简洁的代码,无需覆盖特殊的边缘情况。
【解决方案3】:

不需要Collections.iterator(Collection) 方法,因为Collection 接口已经有一个返回Iteratoriterator() 方法。仅当您已经拥有Collection 并且Iterator 无论如何都与Collection 结合时才有意义。 Collections.iterator(Collection c) 会做什么?它可能只是调用return c.iterator();

我想 Collections.emptyIterator()Collections.emptyListIterator() 保存调用者创建一个空的 Collection / List 的处理只是为了调用它的 iterator() / listIterator() 方法。

GRASP pattern "Information Expert" 表示Iterator 的设计将使用它迭代的类,因为该类本身具有创建Iterator 所需的信息。

【讨论】:

  • 在这种情况下,为什么Collection interfaceaddAll方法,而Collections类也有addAll方法
  • 看起来它们略有不同。 Collection#addAll 将另一个 Collection 作为参数。 Collections.addAll 采用 varargs 参数表示要添加到 Collection 的所有元素。
【解决方案4】:

但我们有 Collection.iterator(),这正是您要找的。​​p>

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

因为每个Collection已经有了自己的迭代器,把它作为Collections中的实用方法是没有意义的,而且实现起来很简单:只需返回调用iterator()的结果即可Collection 上的方法作为参数接收。

【讨论】:

  • 是的,我知道还有其他选择,我的问题是为什么不包含在 Collections 实用程序框架中
  • @user1988876 好的,我扩展了我的解释
猜你喜欢
  • 2012-01-28
  • 2012-06-27
  • 1970-01-01
  • 2011-02-24
  • 2011-01-06
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多