Java 如何创建不可变迭代器?

Java 如何创建不可变迭代器?,java,iterator,Java,Iterator,如果我有一个映射或列表并从中获取迭代器,例如: var map = new HashMap(); var iterator = map.entrySet().iterator(); 如果某个东西在事实发生后修改了该映射,它会影响迭代器吗?或者迭代器在创建之后基本上是不变的吗 如果不是不可变的,如何创建不可变迭代器?迭代器的唯一有效操作是增量和取消引用,尽管Java迭代器在其方法中结合了这两种操作。如果您有一个不可修改的迭代器,那么只剩下解引用。解引用可以给您一个对象引用,也可以是无效的,因为它

如果我有一个映射或列表并从中获取迭代器,例如:

var map = new HashMap();
var iterator = map.entrySet().iterator();
如果某个东西在事实发生后修改了该映射,它会影响迭代器吗?或者迭代器在创建之后基本上是不变的吗


如果不是不可变的,如何创建不可变迭代器?

迭代器的唯一有效操作是增量和取消引用,尽管Java迭代器在其方法中结合了这两种操作。如果您有一个不可修改的迭代器,那么只剩下解引用。解引用可以给您一个对象引用,也可以是无效的,因为它没有引用集合中的有效位置

但这些语义与:可选对象可以是空的,也可以有有效的对象引用。因此,从创建一个可选的,并将其用作不可修改的迭代器:

private Optional<T> unmodifiableNext(Iterator<T> i)
{
   if (i.hasNext()) {
      return Optional.ofNullable(i.next());
   } else {
      return Optional.empty();
   }
}

这还有一个额外的好处,即Optional不再绑定到集合,因此可以安全地更改集合,而无需更改Optional引用的对象。

迭代器实例本身通常不需要可变/不可变的概念。但是,它所迭代的集合可能是不可修改或不可变的。下面是一种禁用迭代器更改集合能力的方法。如果返回此类的实例,则返回的迭代器的remove方法将被禁用。该类通过返回UnmodifiableIterator.createyourIterator来使用

import java.util.Iterator;

/**
 * UnmodifiableIterator, A wrapper around an iterator instance that
 * disables the remove method.
 */
public final class UnmodifiableIterator<E> implements Iterator<E> {

    /**
     * iterator, The base iterator.
     */
    private final Iterator<? extends E> iterator;

    private UnmodifiableIterator(final Iterator<? extends E> iterator) {
        this.iterator = iterator;
    }

    public static <E> Iterator<E> create(final Iterator<? extends E> iterator) {
        if (iterator == null) {
            throw new NullPointerException("The iterator can not be null.");
        }
        return new UnmodifiableIterator<>(iterator);
    }

    @Override
    public boolean hasNext() {
        return iterator.hasNext();
    }

    @Override
    public E next() {
        return iterator.next();
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("Iterator.remove() is disabled.");
    }

}

相关的:?相关的,但我的问题可能措辞更好,更接近为什么-1?我认为这是一个有趣的问题?请阅读文档,即:这个类的所有集合视图方法返回的迭代器都是快速失败的:如果在迭代器创建后的任何时间,以任何方式修改映射,除了通过迭代器自己的remove方法,迭代器将抛出ConcurrentModificationException;如果我理解正确,您想要一个迭代器,它是某个时刻底层集合的快照?