Skip to content

Commit 0085d12

Browse files
mariuszsgmessner
authored andcommitted
lazy streams with pager spliterator (#295) (#296)
1 parent 509d858 commit 0085d12

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

src/main/java/org/gitlab4j/api/Pager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.List;
88
import java.util.NoSuchElementException;
99
import java.util.stream.Stream;
10+
import java.util.stream.StreamSupport;
1011

1112
import javax.ws.rs.core.MultivaluedMap;
1213
import javax.ws.rs.core.Response;
@@ -333,4 +334,12 @@ public Stream<T> stream() throws GitLabApiException {
333334

334335
return (streamBuilder.build());
335336
}
337+
338+
public Stream<T> lazyStream() {
339+
// Make sure that current page is 0, this will ensure the whole list is streamed
340+
// regardless of what page the instance is currently on.
341+
currentPage = 0;
342+
343+
return StreamSupport.stream(new PagerSpliterator<T>(this), false);
344+
}
336345
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.gitlab4j.api;
2+
3+
import java.util.Iterator;
4+
import java.util.Spliterator;
5+
import java.util.function.Consumer;
6+
7+
class PagerSpliterator<T> implements Spliterator<T> {
8+
9+
private Pager<T> pager;
10+
11+
private Iterator<T> elements;
12+
13+
PagerSpliterator(Pager<T> pager) {
14+
this.pager = pager;
15+
if (pager.hasNext()) {
16+
elements = this.pager.next().iterator();
17+
}
18+
}
19+
20+
@Override
21+
public boolean tryAdvance(Consumer<? super T> action) {
22+
if (elements.hasNext()) {
23+
action.accept(elements.next());
24+
return true;
25+
} else if (pager.hasNext()) {
26+
elements = pager.next().iterator();
27+
action.accept(elements.next());
28+
return true;
29+
}
30+
return false;
31+
}
32+
33+
@Override
34+
public Spliterator<T> trySplit() {
35+
return null;
36+
}
37+
38+
@Override
39+
public long estimateSize() {
40+
return pager.getTotalItems();
41+
}
42+
43+
@Override
44+
public int characteristics() {
45+
return 0;
46+
}
47+
}

0 commit comments

Comments
 (0)