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

Posted

技术标签:

【中文标题】为啥在 Java 中使用自定义迭代器?【英文标题】:Why use a custom Iterator in Java?为什么在 Java 中使用自定义迭代器? 【发布时间】:2019-01-17 18:17:43 【问题描述】:

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

【问题讨论】:

请转至help center 了解如何/在这里询问什么。你对这个社区的运作方式有严重的误解,而不是告诉人们“只发布正确的答案”,你应该退后一步,删除这个问题,让自己做得更好。 【参考方案1】:

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

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

例如,如果您在创建 for 循环时尝试更新(例如:通过删除项目)集合,您将在 Java 中引发并发异常。在这种情况下,您必须使用迭代器。

我不知道大型数据收集是否有一些用途。您可以阅读其他 *** 答案:why is the enhanced for loop more efficient than the normal for loop

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

【讨论】:

【参考方案2】:

为什么迭代器如此强大?

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

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

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

更多阅读参考:http://inmachineswetrust.com/posts/understanding-iterators/

【讨论】:

以上是关于为啥在 Java 中使用自定义迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

Java 经典实例:自定义迭代器

为啥我的 Java 自定义单元格渲染器在选择行/单元格时不显示突出显示?

OOPC++自定义类型的迭代器

C# 自定义迭代器实现

使用迭代器做自定义筛选

通过Lua迭代器自定义实现对c#集合的遍历