diff options
Diffstat (limited to 'base/src/main/java/bjc/utils/funcutils/IteratorUtils.java')
| -rw-r--r-- | base/src/main/java/bjc/utils/funcutils/IteratorUtils.java | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java b/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java index c639da6..3cdee26 100644 --- a/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java +++ b/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java @@ -10,6 +10,36 @@ import java.util.function.Function; * */ public class IteratorUtils { + public static class ChainIterator<T1, T2> implements Iterator<T2> { + private Iterator<T1> mainItr; + private Function<T1, Iterator<T2>> trans; + + private Iterator<T2> curItr; + + public ChainIterator(Iterator<T1> mainItr, Function<T1, Iterator<T2>> trans) { + this.mainItr = mainItr; + this.trans = trans; + } + + @Override + public boolean hasNext() { + if (curItr != null) { + if (curItr.hasNext()) return true; + else return mainItr.hasNext(); + } + + return mainItr.hasNext(); + } + + @Override + public T2 next() { + if (curItr == null || !curItr.hasNext()) { + curItr = trans.apply(mainItr.next()); + } + + return curItr.next(); + } + } /** * Convert an iterator to an iterable. * @@ -31,4 +61,8 @@ public class IteratorUtils { public static <E> Iterator<E> I(Iterable<E> itr) { return itr.iterator(); } + + public static <A, B> Iterator<B> chain(Iterator<A> itrA, Function<A, Iterator<B>> itrB) { + return new ChainIterator(itrA, itrB); + } } |
