私は新しいJava 8の機能を学習しています。ストリーム(java.util.stream.Stream)とコレクターを試しているうちに、ストリームを2回使用できないことに気付きました。それを再利用する方法はありますか? documentationJava 8でStreamを再利用する方法はありますか?
から
24
A
答えて
32
:
ストリームは、一度だけ(中間または末端ストリームの操作を呼び出す)に操作されなければなりません。
ストリームの再利用が検出された場合、ストリームの実装によってIllegalStateExceptionがスローされることがあります。
したがって、ストリームは再利用されるものではありません。
1
ストリームの全体のアイデアは一度オフであるということです。これにより、中間ストレージなしで再入力不可能なソースを作成することができます(たとえば、ネットワーク接続から回線を読み取るなど)。あなたはそこにいくつかのケースでは、ストリームを実体化したくない場合は
Stream<MyType> stream = // get the stream from somewhere
List<MyType> list = stream.collect(Collectors.toList()); // materialize the stream contents
list.stream().doSomething // create a new stream from the list
list.stream().doSomethingElse // create one more stream from the list
:あなたは、しかし、ストリームのコンテンツを再利用したい場合は、「ハードコピー」を取得するために中間コレクションにそれをダンプします一度に同じストリームでいくつかのことを行う方法です。たとえば、thisまたはthis質問を参照してください。
23
ストリームを再利用する場合は、サプライヤにストリーム式をラップし、新しいストリームが必要なときは常にmyStreamSupplier.get()を呼び出します。たとえば、
Supplier<Stream<String>> sup =() ->
someList.stream();
List<String> nonEmptyStrings = sup.get().filter(s -> !s.isEmpty()).collect(Collectors.toList());
Set<String> uniqueStrings = sup.get().collect(Collectors.toSet());
9
「他にはありません」と述べたように、
しかし、それは、多くの基本的な操作のための便利なsummaryStatistics()
を覚えておくと便利です。
ので、代わりの:
List<Person> personList = getPersons();
personList.stream().mapToInt(p -> p.getAge()).average().getAsDouble();
personList.stream().mapToInt(p -> p.getAge()).min().getAsInt();
personList.stream().mapToInt(p -> p.getAge()).max().getAsInt();
次のことが可能です。
// Can also be DoubleSummaryStatistics from mapToDouble()
IntSummaryStatistics stats = personList.stream()
.mapToInt(p-> p.getAge())
.summaryStatistics();
stats.getAverage();
stats.getMin();
stats.getMax();
関連する問題
- 1. Jobインスタンスを再利用する方法はありますか?
- 2. Android 6.0でJava 8 Stream APIを使用する方法
- 3. akka-stream flowを再利用するエレガントな方法
- 4. Java 8 Streamで例外を処理する方法は?
- 5. XMLスキーマでアサーションを再利用する方法はありますか?
- 6. Pythonでスレッドワーカーを再利用する方法はありますか?
- 7. 再利用可能なシェイプオブジェクトを作成する方法はありますか?
- 8. Webアプリケーションで使用する再利用可能なログプロジェクトを作成する方法はありますか?
- 9. 再利用できるUrl Spiderコンポーネントはありますか?
- 10. ブランチ名を再利用するリスクはありますか?
- 11. 閉じるJava 8 Stream
- 12. Azure Stream Analyticsクエリでサブクエリの結果を再利用する
- 13. Java EE 5+でEJBを再利用する方法
- 14. ループ内で同じjavaメッセージパラメータを再利用する方法
- 15. クラスタイプの定義全体で汎用ワイルドカードを再利用する方法はありますか?
- 16. android alertialogを再利用する方法
- 17. 変数を再利用する必要がありますか?
- 18. IOS swift TableViewに再利用できる方法があります
- 19. 後で再利用するためにRuby VALUEの値をキャッシュする方法はありますか?
- 20. オブジェクトフィールドとしてリストする - Stream(Java 8)経由で処理する方法?
- 21. 以下のコードから、再利用性をjavascript関数に適用する方法はありますか?
- 22. JavaFX 8:FXMLの再利用
- 23. java 8 stream apiからリストを作成
- 24. forEach for Java 8 StreamのforEachOrdered
- 25. RALLYでREST API経由で作成したフィルタを保存(再利用)する方法はありますか
- 26. Javaで利用可能なSMS Pduパーサーはありますか?
- 27. 異なるUItableViewControllerのStoryboardで作成されたUITableViewCellビューを再利用する方法はありますか?
- 28. Java 8ストリームで複数の操作を行う方法はありますか?
- 29. Javaアプレットでh264ビデオを再生する方法はありますか?
- 30. Javaで静的クラスを再初期化する方法はありますか?
はい、ストリームがいる場合にのみ、再利用することができますいずれの用途でも端末操作を呼び出さない。 –
[ストリームが既に操作されているか閉じているのを避けるためにストリームをコピーする](java 8)](http://stackoverflow.com/questions/23860533/copy-a-stream-to-avoid-stream- has-already-been-been-been-operated-on-closed-java-8) – Andrejs