Commit 0085d120 authored by Mariusz Smykuła's avatar Mariusz Smykuła Committed by Greg Messner
Browse files

lazy streams with pager spliterator (#295) (#296)

parent 509d8580
......@@ -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<T> implements Iterator<List<T>>, Constants {
return (streamBuilder.build());
}
public Stream<T> 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<T>(this), false);
}
}
package org.gitlab4j.api;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.function.Consumer;
class PagerSpliterator<T> implements Spliterator<T> {
private Pager<T> pager;
private Iterator<T> elements;
PagerSpliterator(Pager<T> pager) {
this.pager = pager;
if (pager.hasNext()) {
elements = this.pager.next().iterator();
}
}
@Override
public boolean tryAdvance(Consumer<? super T> 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<T> trySplit() {
return null;
}
@Override
public long estimateSize() {
return pager.getTotalItems();
}
@Override
public int characteristics() {
return 0;
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment