diff --git a/src/main/java/org/gitlab4j/api/Pager.java b/src/main/java/org/gitlab4j/api/Pager.java index 70f790c2ecc940db28aa7d5b4fc58ca38a68b096..bb73d65145847f215537b9b23feda591df9fae35 100644 --- a/src/main/java/org/gitlab4j/api/Pager.java +++ b/src/main/java/org/gitlab4j/api/Pager.java @@ -7,6 +7,7 @@ import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import java.util.stream.Stream; +import java.util.stream.StreamSupport; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; @@ -333,4 +334,12 @@ public class Pager implements Iterator>, Constants { return (streamBuilder.build()); } + + public Stream lazyStream() { + // Make sure that current page is 0, this will ensure the whole list is streamed + // regardless of what page the instance is currently on. + currentPage = 0; + + return StreamSupport.stream(new PagerSpliterator(this), false); + } } diff --git a/src/main/java/org/gitlab4j/api/PagerSpliterator.java b/src/main/java/org/gitlab4j/api/PagerSpliterator.java new file mode 100644 index 0000000000000000000000000000000000000000..943373126a5a1847e3c61f209e81cdb89680ff50 --- /dev/null +++ b/src/main/java/org/gitlab4j/api/PagerSpliterator.java @@ -0,0 +1,47 @@ +package org.gitlab4j.api; + +import java.util.Iterator; +import java.util.Spliterator; +import java.util.function.Consumer; + +class PagerSpliterator implements Spliterator { + + private Pager pager; + + private Iterator elements; + + PagerSpliterator(Pager pager) { + this.pager = pager; + if (pager.hasNext()) { + elements = this.pager.next().iterator(); + } + } + + @Override + public boolean tryAdvance(Consumer action) { + if (elements.hasNext()) { + action.accept(elements.next()); + return true; + } else if (pager.hasNext()) { + elements = pager.next().iterator(); + action.accept(elements.next()); + return true; + } + return false; + } + + @Override + public Spliterator trySplit() { + return null; + } + + @Override + public long estimateSize() { + return pager.getTotalItems(); + } + + @Override + public int characteristics() { + return 0; + } +}