diff options
author | Carlo Zancanaro <carlo@zancanaro.id.au> | 2015-05-31 13:53:08 +1000 |
---|---|---|
committer | Carlo Zancanaro <carlo@zancanaro.id.au> | 2015-05-31 13:53:08 +1000 |
commit | c25450f6288748782ad60cc7c4b8e0e0bdc52c1c (patch) | |
tree | d25bd7a6bac5535cdff87fac5cbe0146a59f7b75 /src/main/java/au/id/zancanaro/Iterators.java | |
parent | d29e1d49116c66adab72b1c1bb49c1fa3d4f8140 (diff) |
Better code, based off ParentRunner among other things
Diffstat (limited to 'src/main/java/au/id/zancanaro/Iterators.java')
-rw-r--r-- | src/main/java/au/id/zancanaro/Iterators.java | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/main/java/au/id/zancanaro/Iterators.java b/src/main/java/au/id/zancanaro/Iterators.java index b879c76..08cc37e 100644 --- a/src/main/java/au/id/zancanaro/Iterators.java +++ b/src/main/java/au/id/zancanaro/Iterators.java @@ -1,7 +1,11 @@ package au.id.zancanaro; +import java.util.Collections; import java.util.Iterator; +import java.util.List; +import java.util.Optional; import java.util.function.Function; +import java.util.function.Predicate; public final class Iterators { public static <T> RangeIterator<T> rangeIterator(int countTo, Function<Integer,T> fn) { @@ -127,4 +131,45 @@ public final class Iterators { } } + + public static <T> FilteringIterator<T> filteringIterator(Predicate<T> pred, Iterator<T> iterator) { + return new FilteringIterator<>(pred, iterator); + } + + private static class FilteringIterator<T> implements Iterator<T> { + private final Predicate<T> predicate; + private final Iterator<T> iterator; + private List<T> nextValue; + + public FilteringIterator(Predicate<T> pred, Iterator<T> iterator) { + this.predicate = pred; + this.iterator = iterator; + this.nextValue = null; + } + + private void populateNext() { + while (nextValue == null && iterator.hasNext()) { + T value = iterator.next(); + if (predicate.test(value)) { + nextValue = Collections.singletonList(value); + } else { + nextValue = null; + } + } + } + + @Override + public boolean hasNext() { + populateNext(); + return nextValue != null; + } + + @Override + public T next() { + populateNext(); + T result = nextValue.get(0); + nextValue = null; + return result; + } + } } |