From 0085d120b4140b489b90942336a3328b364f6f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mariusz=20Smyku=C5=82a?= Date: Sun, 10 Feb 2019 03:29:26 +0100 Subject: [PATCH] lazy streams with pager spliterator (#295) (#296) --- src/main/java/org/gitlab4j/api/Pager.java | 9 ++++ .../org/gitlab4j/api/PagerSpliterator.java | 47 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/main/java/org/gitlab4j/api/PagerSpliterator.java diff --git a/src/main/java/org/gitlab4j/api/Pager.java b/src/main/java/org/gitlab4j/api/Pager.java index 70f790c2..bb73d651 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 00000000..94337312 --- /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; + } +} -- GitLab