当前位置: 首页 > 知识库问答 >
问题:

为什么在Java中使用自定义迭代器?

司马奇希
2023-03-14

我知道这个问题在这个论坛上已经被问过好几次了。但我仍在发帖,因为没有一个答案看起来是具体的。专家们,你们能帮我理解什么时候使用迭代器吗。当我们有一个非常大的数据集时,我们是理想地使用它,还是当我们有大量数据要返回时,将其用作方法的返回类型?

共有2个答案

太叔航
2023-03-14

为什么迭代器如此强大?

假设我们想要任何素数的和小于最大值。我们可以先创建一个包含所有整数(最大值)的列表,然后使用我们最喜欢的算法只保留素数,然后将列表传递给sum()。如果最大值是10亿呢?过滤后的列表不仅需要很长时间才能构建,而且需要大量的内存,而我们真正关心的是它的总和。相反,我们可以构造一个迭代器,依次生成素数并计算滚动和;当下一个素数超过最大值时,我们将知道停止并返回当前和。

毫不奇怪,迭代器在处理非常大的序列或数据集,甚至无限的序列或数据集时可以节省大量的内存和时间。事实上,迭代器使我们能够用有限的内存表示无限多的项。即使对于较小的序列或数据集,使用迭代器也可以帮助我们编写更高效的代码。下面是一些使用迭代器可能有优势的场景:

在访问序列中某些项的数据流上执行计算,而不首先将整个序列存储在可管理的块中处理大型文件或数据集(缓冲)在序列上执行计算,而不知道是否需要序列中的所有项构建自定义数据采样器或随机数生成器使用迭代器的最大缺点是实现一个完整的迭代器协议需要许多行代码,即使生成的迭代器是初级的(如myIteratorClone)。当然,如果Python不提供一些方法来简化迭代器的生成过程,可以想象,只需一行简单的代码,它就不会名副其实!我们将在即将发布的博客文章中了解这些快捷方式和一些方便的内置迭代器。

有关更多信息,请参阅:http://inmachineswetrust.com/posts/understanding-iterators/

司空俊雄
2023-03-14

如果您查看一些关于这个主题的博客和文章,您经常会发现这样一句话:迭代器提供了许多方法来在遍历集合时处理它,比如修改它。使用“while”或“for”循环无法做到这一点,它们被用作集合上的只读循环。

您可能会找到一些使用for或while循环更新集合的解决方案,但它们可能比使用迭代器更难实现。

例如,如果在对集合进行For循环的同时尝试更新集合(例如:通过删除项),则会在Java中引发并发异常。在这种情况下,必须使用迭代器。

我不知道在大型数据收集中是否有一些用法。您可以阅读其他stackoverflow答案:为什么增强的for循环比普通的for循环更有效

java迭代器的一些参考:

  • https://www.baeldung.com/java-iterator
  • https://www.tutorialspoint.com/java/java_using_iterator.htm
  • https://www.geeksforgeeks.org/iterator-vs-foreach-in-java/
  • https://dzone.com/articles/iteration-over-java-collections-with-high-performa
 类似资料:
  • 问题内容: 我正在浏览以下代码示例: 我想知道使用Iterator接口的实现而不是使用普通的for-each循环有什么好处? 如果此示例不相关,那么当我们应该使用Iterator时会是一个好的情况吗? 谢谢。 问题答案: 该 for-each循环 与Java 5中引入的,所以它不是那么“老”。 如果只想迭代一个集合,则应为每个循环使用 但是有时“普通的” 迭代器的 方法对于检查 迭代器 是否还有更

  • 我想为客户数据结构提供一个视图,它有自己的迭代器。我编写了一个小程序来测试它,如下所示。如果我取消对begin()的注释,它就会工作。但是如果我使用DummyIter,那么我会得到一个编译错误。 在我的完整程序中,我实现了一个完整的迭代器,但为了简单起见,我把它缩小到了必要的函数。 我使用的是GCC 11.1.0。我在迭代器中缺少了什么使其符合范围?

  • 问题内容: 在回答中,用户说了这样的话:“带有ArrayLists的迭代器的一个大用例是,当您要在迭代时删除元素时”。 即使使用Java中的ArrayList的remove方法也可以实现。我的问题是为什么我们在ArrayList中需要迭代器? 考虑以下代码: 谁能解释迭代器的意义?如果可以用代码解释我,那将是很棒的。 问题答案: 如前所述,迭代器用于迭代数组内容时要删除的内容。如果您不使用迭代器,

  • 我试图编写一些代码来执行函数式序列的创建。我写了一个函数range它返回一个对象,你可以迭代它,foreach样式,以遍历数字a,a 1,...,b - 1。然后我写了另一个函数map它返回另一个可迭代对象,其中序列中的每个元素都是使用可迭代对象的相应元素调用的结果。 如果我使用< code>-O1或更低版本进行编译,这将按预期工作;使用< code>-O2或更高版本,我的foreach循环(在底

  • 为什么JSF2/Facelet的ui:repeat不接受java。util。迭代器的值?可以在迭代器后面隐藏如此多的实现和内存节约,因为长度不需要知道,所以拥有它是非常有用的。但是相反,我需要将迭代器转换为列表,并抛弃所有优点,以便ui:repeat。 可能有阶段、时间或可序列化的原因,但我对可用文档的浏览并没有给出这些原因。我们还没有使这一不可能成为可能的科学吗?

  • 我们可以在SpringDataNeo4j中为节点实体定制迭代器吗 我有一个将CustomHashCollection作为iterable的现有代码。我想将该项目转换为使用Neo4j。我可以使用自定义迭代器,因为它是大多数NodeEntity类中的私有成员<提前谢谢。