summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--base/src/main/java/bjc/utils/funcutils/IteratorUtils.java34
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);
+ }
}