6
6
import com .azure .core .util .IterableStream ;
7
7
import com .azure .core .util .paging .PageRetrieverSync ;
8
8
9
+ import java .util .ArrayList ;
9
10
import java .util .function .BiFunction ;
10
11
import java .util .function .Function ;
11
12
import java .util .function .Supplier ;
13
+ import java .util .stream .Collectors ;
12
14
import java .util .stream .Stream ;
13
15
14
16
/**
73
75
*/
74
76
public class PagedIterable <T > extends PagedIterableBase <T , PagedResponse <T >> {
75
77
private final PagedFlux <T > pagedFlux ;
78
+ private final Function <Integer , PagedResponse <T >> firstPageRetriever ;
79
+ private final BiFunction <String , Integer , PagedResponse <T >> nextPageRetriever ;
76
80
77
81
/**
78
82
* Creates instance given {@link PagedFlux}.
@@ -81,6 +85,8 @@ public class PagedIterable<T> extends PagedIterableBase<T, PagedResponse<T>> {
81
85
public PagedIterable (PagedFlux <T > pagedFlux ) {
82
86
super (pagedFlux );
83
87
this .pagedFlux = pagedFlux ;
88
+ this .firstPageRetriever = null ;
89
+ this .nextPageRetriever = null ;
84
90
}
85
91
86
92
/**
@@ -150,7 +156,9 @@ public PagedIterable(Supplier<PagedResponse<T>> firstPageRetriever,
150
156
this (() -> (continuationToken , pageSize ) ->
151
157
continuationToken == null
152
158
? firstPageRetriever .get ()
153
- : nextPageRetriever .apply (continuationToken ), true );
159
+ : nextPageRetriever .apply (continuationToken ),
160
+ pageSize -> firstPageRetriever .get (),
161
+ (continuationToken , pageSize ) -> nextPageRetriever .apply (continuationToken ));
154
162
}
155
163
156
164
/**
@@ -175,7 +183,7 @@ public PagedIterable(Function<Integer, PagedResponse<T>> firstPageRetriever,
175
183
BiFunction <String , Integer , PagedResponse <T >> nextPageRetriever ) {
176
184
this (() -> (continuationToken , pageSize ) -> continuationToken == null
177
185
? firstPageRetriever .apply (pageSize )
178
- : nextPageRetriever .apply (continuationToken , pageSize ), true );
186
+ : nextPageRetriever .apply (continuationToken , pageSize ), firstPageRetriever , nextPageRetriever );
179
187
}
180
188
181
189
/**
@@ -187,17 +195,51 @@ public PagedIterable(Function<Integer, PagedResponse<T>> firstPageRetriever,
187
195
*/
188
196
@ SuppressWarnings ("deprecation" )
189
197
public <S > PagedIterable <S > mapPage (Function <T , S > mapper ) {
190
- return new PagedIterable <>(pagedFlux .mapPage (mapper ));
198
+ if (pagedFlux != null ) {
199
+ return new PagedIterable <>(pagedFlux .mapPage (mapper ));
200
+ }
201
+ Function <Integer , PagedResponse <S >> firstMappedPageRetriever = pageSize -> {
202
+ PagedResponse <T > firstPageResponse = this .firstPageRetriever .apply (pageSize );
203
+ PagedResponse <S > firstMappedPageResponse = mapPagedResponse (firstPageResponse , mapper );
204
+ return firstMappedPageResponse ;
205
+ };
206
+ BiFunction <String , Integer , PagedResponse <S >> nextMappedPageRetriever = (continuationToken , pageSize ) -> {
207
+ PagedResponse <T > nextPageResponse = this .nextPageRetriever .apply (continuationToken , pageSize );
208
+ PagedResponse <S > nextMappedPageResponse = mapPagedResponse (nextPageResponse , mapper );
209
+ return nextMappedPageResponse ;
210
+ };
211
+ return new PagedIterable <>(firstMappedPageRetriever , nextMappedPageRetriever );
191
212
}
192
213
193
214
/**
194
215
* Create PagedIterable backed by Page Retriever Function Supplier.
195
216
*
196
- * @param provider the Page Retrieval Provider
197
- * @param ignored param is ignored, exists in signature only to avoid conflict with first ctr
217
+ * @param provider the Page Retrieval Provider.
218
+ * @param firstPageRetriever first page retriever function to get the first page given the page size.
219
+ * @param nextPageRetriever next page retriever function to get the next page given a continuation token and the page size.
198
220
*/
199
- private PagedIterable (Supplier <PageRetrieverSync <String , PagedResponse <T >>> provider , boolean ignored ) {
221
+ private PagedIterable (Supplier <PageRetrieverSync <String , PagedResponse <T >>> provider ,
222
+ Function <Integer , PagedResponse <T >> firstPageRetriever ,
223
+ BiFunction <String , Integer , PagedResponse <T >> nextPageRetriever ) {
200
224
super (provider );
201
225
this .pagedFlux = null ;
226
+ this .firstPageRetriever = firstPageRetriever ;
227
+ this .nextPageRetriever = nextPageRetriever ;
202
228
}
229
+
230
+ private <S > PagedResponse <S > mapPagedResponse (PagedResponse <T > pagedResponse , Function <T , S > mapper ) {
231
+ if (pagedResponse == null ) {
232
+ return null ;
233
+ }
234
+ return new PagedResponseBase <String , S >(pagedResponse .getRequest (),
235
+ pagedResponse .getStatusCode (),
236
+ pagedResponse .getHeaders (),
237
+ pagedResponse .getValue ()
238
+ .stream ()
239
+ .map (mapper )
240
+ .collect (Collectors .toCollection (() -> new ArrayList <>(pagedResponse .getValue ().size ()))),
241
+ pagedResponse .getContinuationToken (),
242
+ null );
243
+ }
244
+
203
245
}
0 commit comments