Java 带分页的API的流与迭代器

Java 带分页的API的流与迭代器,java,rest,api,java-stream,Java,Rest,Api,Java Stream,给定一个带有分页的web API,该API返回的项超过了内存中的任何时间 HTTP GET /items?start=0&limit=10 我想构造一个易于使用的Java客户机。分页客户端很难使用 PageRequest pageRequest = new PageResut(0,10); Page<Item> page = client.findItems(page); while( !page.isLastPage() ) { Page<Item> n

给定一个带有分页的web API,该API返回的项超过了内存中的任何时间

HTTP GET /items?start=0&limit=10
我想构造一个易于使用的Java客户机。分页客户端很难使用

PageRequest pageRequest = new PageResut(0,10);
Page<Item> page = client.findItems(page);
while( !page.isLastPage() ) {
   Page<Item> nextPage = client.findItems( page.getNextPage() );
}
。。。或者
使API更易于使用

Stream<Item> items = client.pagingItemsStream();
// every 10 elements the stream requests the next page behind the scenes
// i.e. the paging code above is hidden in the stream supplier
items.forEach(this::dostuff);
streamitems=client.pagingItemsStream();
//流每10个元素请求后台的下一页
//即,上面的分页代码隐藏在流供应商中
项目。forEach(此::dostuff);
更通用。流的使用方式是否有任何不适合此用例的地方?比如:

  • 与取回流中最后一个项目时在幕后请求下一页相比,流是否假定所有项目都已知
  • 由于执行新页面请求以获取下一页面中的项目,请求项11可能会失败,并出现
    运行时异常
    ,这是否与流的良好实践相反

我想把这个作为一个评论,但有点太大了

流是否假定所有项都已知

看看
Files::lines
例如,无法知道某个文件中的确切行数,因此底层实现不知何故做到了这一点。。。对于简单的顺序流,对于并行流,它们所做的只是缓冲,直到至少缓冲了
1024行
行(+1024行在下一个缓冲区中,依此类推)。因此,是的,没有已知大小的流实现是绝对可能的,即使大小可以动态变化——尽管这也会带来很多其他问题

请求项#11可能会因运行时异常而失败,因为执行了新页面请求以获取下一页面中的项,这与流的良好实践相违背吗

我不太确定我是否完全理解这一点,但似乎您关心的是对同一数据的多个同时请求。如果是这样的话,对于流来说这是不正常的,就像对于
PageRequest
一样;毕竟,您只是读取了数据——如果数据不存在,则返回一个空列表或部分列表或其他内容,但不要抛出异常。如果底层的
PageRequest
抛出这个问题,请在您将要使用的包装中处理它

请注意,通常您可以非常轻松地从
Iterator->Stream
Stream->Iterator
进行转换(如果需要)。即便如此,如果您能够实现它,我还是会坚持使用
方法

Stream<Item> items = client.pagingItemsStream();
// every 10 elements the stream requests the next page behind the scenes
// i.e. the paging code above is hidden in the stream supplier
items.forEach(this::dostuff);