All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.core.collection.CopiedIter Maven / Gradle / Ivy

There is a newer version: 5.8.33
Show newest version
package cn.hutool.core.collection;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

/**
 * 复制 {@link Iterator}
* 为了解决并发情况下{@link Iterator}遍历导致的问题(当Iterator被修改会抛出ConcurrentModificationException) * ,故使用复制原Iterator的方式解决此问题。 * *

* 解决方法为:在构造方法中遍历Iterator中的元素,装入新的List中然后遍历之。 * 当然,修改这个复制后的Iterator是没有意义的,因此remove方法将会抛出异常。 * *

* 需要注意的是,在构造此对象时需要保证原子性(原对象不被修改),最好加锁构造此对象,构造完毕后解锁。 * * @param 元素类型 * @author Looly * @since 3.0.7 */ public class CopiedIter implements IterableIter, Serializable { private static final long serialVersionUID = 1L; private final Iterator listIterator; /** * 根据已有{@link Iterator},返回新的{@code CopiedIter} * * @param iterator {@link Iterator} * @param 元素类型 * @return {@code CopiedIter} */ public static CopiedIter copyOf(Iterator iterator) { return new CopiedIter<>(iterator); } /** * 构造 * * @param iterator 被复制的Iterator */ public CopiedIter(Iterator iterator) { final List eleList = ListUtil.toList(iterator); this.listIterator = eleList.iterator(); } @Override public boolean hasNext() { return this.listIterator.hasNext(); } @Override public E next() { return this.listIterator.next(); } /** * 此对象不支持移除元素 * * @throws UnsupportedOperationException 当调用此方法时始终抛出此异常 */ @Override public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException("This is a read-only iterator."); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy