私はリストを持っています、私はストリームを使用してフィルタリングし、最初の10をつかみ、ユーザに表示したいと思います。 ボタンを押した後、その場所からストリームを続けたいと思います。コレクション後にjavaストリームを続行
List<MyObject> allResults = getResults();
allResults.stream()
.filter(this::someCrazyFiltering)
.limit(10)
.map(this::turnToDisplayItem)
.forEach(this::addDisplayItemToContainer);
// some stuff..
onClick(() -> {
List<MyObject> allResults = getResults();
allResults.stream()
.filter(this::someCrazyFiltering)
.skip(10) // will eventually be 10 * amount of times clicked.
.limit(10)
.map(this::turnToDisplayItem)
.forEach(this::addDisplayItemToContainer);
});
しかし、問題があり、ここで私は(再び)フィルタと一致していないか、これまで多くの最初の10 +上でフィルタを実行するために持っています。
これまでのところ、私が持っている解決策のいくつかは、最後のアイテムのインデックスを保存するためにpeekを使用しています(プレスキップ)。
List<MyObject> allResults = getResults();
allResults.stream()
.filter(this::someCrazyFiltering)
.limit(10)
.peek(o -> this.storeIndex(o, allResults)) // This feels klunky
.map(this::turnToDisplayItem)
.forEach(this::addDisplayItemToContainer);
onClick(() -> {
List<MyObject> allResults = getResults();
allResults.stream()
.skip(this.storedIndexToSkip) // This being stored from storeIndex function above.
.filter(this::someCrazyFiltering)
.limit(10)
.peek(o -> this.storeIndex(o, allResults)) // Store again for next click; This STILL feels klunky
.map(this::turnToDisplayItem)
.forEach(this::addDisplayItemToContainer);
});
誰ができれば、私は
(その後、個別の項目になります)、そこストリームで「インデックス」のようなものはありません、だから私はstoreIndex
関数内allResults.indexOf(o)
を行う必要があります知っているが、これのためのより良い仕組みを考えていますか? filter
/limit
の後にストリームから枝分かれすることができるように
ストリームを一括して無視して、ただ古いループに戻って、i
を10回見つけたら、もう一度やり直してください。
どこから 'getResults()'がデータを取得しますか? 'for'ループの使用には何も問題ありません。どこでもストリームAPIを強制しようとするよりもはるかに優れています。 – Kayaman
それは重要ではなかったので、私はちょうどそれを 'getResults()'としてpsudocodeしました。別のアイデアは、10のものがマッチするまで、または私が最後までヒットするまで、何かを取得しようとしているイテレータをただ持っていたということです。しかし、イライザをしばらく "生きている"ない? – WORMSS
それは重要です。 10000行のデータベースデータと100行のメモリ内データを扱う場合、実行する必要があることに大きな違いがあります。 – Kayaman