当前位置: 代码迷 >> java >> 如何创建一个不可变的迭代器?
  详细解决方案

如何创建一个不可变的迭代器?

热度:125   发布时间:2023-07-16 17:54:26.0

如果我有一个 Map 或一个 List 并从中获取一个迭代器,例如:

var map = new HashMap();
var iterator = map.entrySet().iterator();

如果事后修改了该映射,它会影响迭代器还是迭代器一旦创建就基本不可变?

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

迭代器唯一有效的操作是增量和取消引用(尽管 Java Iterator在其方法中组合了这两者)。 如果您有一个不可修改的迭代器,那只会让您取消引用。 取消引用可以为您提供对象引用,或者取消引用可能无效,因为它没有引用集合中的有效位置。

但这些语义与相同: Optional可以为空或具有有效的对象引用。 因此,从创建一个Optional并将其用作“不可修改的迭代器”:

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

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

迭代器实例本身通常不需要可变性/不变性的概念。 但是,它正在迭代的集合可能是不可修改或不可变的。 这是一种禁用迭代器更改集合的能力的方法。 如果您返回此类的实例,则返回的迭代器的 remove() 方法将被禁用。 该类通过返回 UnmodifiableIterator.create(yourIterator) 使用。

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.");
    }

}
  相关解决方案