Java:为什么迭代器不可复制

Alb*_*ert 10 java iterator iterable copy

我认为这Iterator.copy()将是一个非常方便的功能.您可以以更好的方式实现迭代器过滤器.

例如,Googles Java Collection中filter(和类似的)函数使用的唯一原因UnmodifiableIterator(只是Iterator没有remove)是因为你不能实现这样的过滤器,Iterator否则无法在某些时候复制它.(真的,使用当前界面是不可能的;试试吧.)

另一个优点是你可以在for-each-loop中使用迭代器:因为可复制的迭代器也可以自动迭代.另见这个问题.目前,主要的设计理由不允许这样做是因为Iterator它实现IterableIterator<T> iterator() { return this; }会使无效迭代器.通过使用一个copy函数,它就像它一样简单Iterator<T> iterator() { return copy(); }并且它不会使原始迭代器无效.因此,没有理由不允许这样做.

有什么缘故吗?只是为了减少实现它的复杂性?

ILM*_*tan 10

虽然它们通常是,但迭代器在理论上不必与集合相关联.例如,输入流上的复制方法很难实现,并且很容易导致模糊的内存问题.

  • 但是流不包含非常多的数据,因此要复制基于流的迭代器,必须存储该数据以便可以重新迭代. (2认同)
  • 我认为迭代器及其副本总是返回相同的对象序列.但是,来自同一个流的两个不同的迭代器,我希望总是从流中拉出下一个元素(除了那个相同流的两个生命迭代器会有各种各样的并发问题). (2认同)

Chr*_*röm 5

An Iterator表示来自源的流中的位置(Iterable在java中说),并且不能保证可以复制甚至访问流的源.

例如,你可以在从网络服务器流式传输时迭代字节,在这种情况下,不可能告诉网络服务器中间流"从这个位置开始,我希望你给我两次相同的字节,但是我要求他们异步."

只有一个流,无法复制.

事实上Iterator你通常看到的大部分都是a Collection,这是偶然的.