diff --git a/CHANGELOG.md b/CHANGELOG.md index 05ca67c26..11a6c2e7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * 【all 】 JWT模块加入到all和bom包中(issue#1654@Github) * 【core 】 CollUtil删除所有Map相关操作 * 【all 】 **重要!** 删除过期方法 +* 【core 】 增加IterChian类 ### 🐞Bug修复 diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/IterChain.java b/hutool-core/src/main/java/cn/hutool/core/collection/IterChain.java new file mode 100644 index 000000000..ec73ef039 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/collection/IterChain.java @@ -0,0 +1,90 @@ +package cn.hutool.core.collection; + +import cn.hutool.core.lang.Chain; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +/** + * 组合{@link Iterator},将多个{@link Iterator}组合在一起,便于集中遍历。
+ * 来自Jodd + * + * @param 元素类型 + * @author looly, jodd + */ +public class IterChain implements Iterator, Chain, IterChain> { + + protected final List> allIterators = new ArrayList<>(); + + /** + * 构造 + * 可以使用 {@link #addChain(Iterator)} 方法加入更多的集合。 + */ + public IterChain() { + } + + /** + * Creates new composite iterator with provided iterators. + */ + @SafeVarargs + public IterChain(Iterator... iterators) { + for (final Iterator iterator : iterators) { + addChain(iterator); + } + } + + @Override + public IterChain addChain(Iterator iterator) { + if (allIterators.contains(iterator)) { + throw new IllegalArgumentException("Duplicate iterator"); + } + allIterators.add(iterator); + return this; + } + + // ---------------------------------------------------------------- interface + + protected int currentIter = -1; + + @Override + public boolean hasNext() { + if (currentIter == -1) { + currentIter = 0; + } + + final int size = allIterators.size(); + for (int i = currentIter; i < size; i++) { + final Iterator iterator = allIterators.get(i); + if (iterator.hasNext()) { + currentIter = i; + return true; + } + } + return false; + } + + @Override + public T next() { + if (false == hasNext()) { + throw new NoSuchElementException(); + } + + return allIterators.get(currentIter).next(); + } + + @Override + public void remove() { + if (-1 == currentIter) { + throw new IllegalStateException("next() has not yet been called"); + } + + allIterators.get(currentIter).remove(); + } + + @Override + public Iterator> iterator() { + return this.allIterators.iterator(); + } +}