ページングとAPIのIterator対ストリーム

ヨハン・シェーベルイ:

ページングを使用したWeb 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);

AはStream、より汎用性があります。何がこのユースケースのために、それは不適当そのストリームが使用されることが意図される方法にありますか?お気に入り:

  • ストリームは、ストリーム内の最後の項目がフェッチされるとき、背後で次のページを要求に比べて知られているすべての項目を、前提としていますか?
  • それは、要求項目#11で失敗する可能性があることを、流れの良い慣行に反しているRuntimeException新しいページ要求は、次のページでアイテムを取得するために行われているので?
ユージン:

私はコメントとしてこれを作りたかったが、一種のはあまりにも大きかったです。

ストリームは、すべての項目が知られていると仮定してい...

Files::lines例えばは、基本となる実装が何らかの形で並列1のために、簡単で順次ストリームのために...それをして、特定のファイルにある行の正確な数を知る方法はありません-彼らはすべてのバッファであり、少なくともまで1024行(次のバッファなどに+ 1024)バッファされます。これはあまりにもIMO他の問題の多くをもたらしますけれども-そうです、既知のサイズのないストリームの実装では、そのサイズを動的に変更することができたとしても、絶対に可能です。

それは新しいページ要求は、次のページでアイテムを取得するために行われるため、要求項目#11のRuntimeExceptionで失敗する可能性があることを、流れの良い慣行に反していますか?

非常に確認してください、私は完全にこれを理解し、あなたが同じデータに複数の同時要求に関係していると思われません。もしそうなら、それはのために正常ではないとして、これはかなりのようにストリームのための私には正常ではないだけPageRequestそれはそこにはない場合、空のリストまたはリストの一部または何を返しますが、例外をスローすることはありません-すべての後にあなただけのデータを読み込みます。根本的には場合はPageRequestそれを投げ、あなたはとにかく持っていることをラッパーにそれを扱います。

一般的にあなたから非常に簡単に変換することができますだけで予告Iterator -> StreamしてからStream -> Iterator必要に応じて。それでも、私はに固執でしょうStreamあなたはそれを実装することができた場合にアプローチ。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=208903&siteId=1