java - 带分页的 API 的 Stream 与 Iterator

标签 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> nextPage = client.findItems( page.getNextPage() );
}

将分页客户端隐藏在Iterator ..

Iterator<Item> items = client.pagingItemsIterator();
// every 10 elements the iterator requests the next page behind the scenes i.e.
// the paging code of above is hidden in an iterator
items.forEachRemaining(this::dostuff);

... 或 Stream 使 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);

Stream 更通用。流的使用方式是否有任何不适合此用例的地方?喜欢:

  • 与在获取流中的最后一个项目时在幕后请求下一页相比,流是否假设所有项目都是已知的?
  • 这是否违反了流的良好做法,因为执行新页面请求以获取下一页中的项目,请求项目 #11 可能会失败并返回 RuntimeException

最佳答案

我想把它作为评论,但有点太大了。

Does a stream assume all items are known...

例如,查看 Files::lines,没有办法知道某个文件中的确切行数,因此底层实现以某种方式做到了......对于顺序流这很容易,对于并行的 - 他们所做的就是缓冲,直到至少 1024 行被缓冲(+ 1024 在下一个缓冲区中等等)。所以,是的,没有已知大小的流实现是绝对可能的,即使该大小可以动态更改——尽管这也带来了很多其他问题 IMO。

Is it against good practices of streams, that request item #11 can fail with a RuntimeException because a new page request is performed to get items in the next page?

不太确定我是否完全理解这一点,但您似乎担心对同一数据的多个同时请求。如果是这样,这对我来说对于流来说是不正常的,就像对于 just PageRequest 来说也是不正常的;毕竟你只是读取数据 - 如果它不存在,返回一个空列表或部分列表或其他任何东西,但不要抛出异常。如果底层 PageRequest 抛出它,请在您将拥有的包装器中处理它。

请注意,如果需要,通常您可以很容易地从 Iterator -> StreamStream -> Iterator 进行转换。即便如此,如果可以实现的话,我还是会坚持使用 Stream 方法。

关于java - 带分页的 API 的 Stream 与 Iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55854868/

相关文章:

r - 在 R 中使用管道工 API 进行 Oauth

php - 如何在 WordPress 插件的 SQL 数据库中缓存第三方 API 访问

java - 按值对 LinkedHashMap 进行排序

java - 为什么 Dagger 2 中需要@SubComponent?

java - IntelliJ 无法初始化类 org.jetbrains.jps.builders.JpsBuildBundle

java - 匹配 Spring RequestMapping 中的任何内容

java - Spring-boot thymeleaf 与@pahtvariable 有问题想从数据库中提取一条记录

javascript - AWS Lambda 和 API 网关 - 来自浏览器但不是来自 curl 的 500

python - Python REST(Web 服务)框架的推荐?

c# - VSO API Work Item PATCH 给出 400 Bad Request