Javaでは、ストリームチェーンを壊さずにストリームのすべての要素に機能を適用する方法はありますか?私はforEachを呼び出すことができますが、そのメソッドはストリームではなくvoidを返します。Java 8では、ストリームチェーンを壊さずにStreamのすべての要素に機能を適用します。
答えて
Stream
のmap()
機能を探しています。
例:
List<String> strings = stream
.map(Object::toString)
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
マップを使用する場合は、複数の行を使用する必要があります。 myStream.map(obj - > {obj.foo(); return obj;})のようなものです。私はそこに1行の解決策があるのだろうかと思っていました。 – alexgbelov
そこのメソッドを参照することもできます。私のmodをチェックしてください。 – csenga
私はあなたがStream.peek
を探していると思います。しかし、主にデバッグ方法として設計されているので、慎重にドキュメントを読んでください。ドキュメントから:
この方法では、あなたは彼らが
peek
に渡されたアクションはnon interferingでなければならないパイプライン
に特定のポイントを過ぎて流れるよう要素を見たい場合は、デバッグをサポートするために主に存在しています。
あなたはbreaking the stream chain
によって何を意味するのか全くわからないが、Stream
を返しStream
上の任意の操作がブレークまたははあなたのストリームを消費しません。ストリームはterminal operations
によって消費され、forEach
はStream<T>
を返していないため、forEachおよびforEachの前にすべてのintermediate
操作を実行することでストリームを終了します。あなたがコメントで提供される例で
:
myStream.map(obj -> {obj.foo(); return obj;}
あなたは本当に1つのライナーでこれを行うことはできません。もちろん、メソッドのリファレンスを使用することができたが、その後、あなた返さStream
は異なるタイプ(foo
リターンタイプを想定)で次のようになります。あなたのmap
操作が強く推奨されている、stateful
であることのほかに
myStream.map(Obj::foo) // this will turn into Stream<T>, where T is
// the return type of foo, instead of Stream<Obj>
。コードはコンパイルされ、必要に応じて機能するかもしれませんが、後で失敗する可能性があります。 map
操作はstateless
である必要があります。
少なくとも3つの方法があります。
A.使用peek()
:サンプルコードのために、私はあなたが2消費者法methodA
とmethodB
呼びたいと想定しましたドキュメントは唯一の「デバッグ」のためにそれを使用すると言うが、
list.stream().peek(x -> methodA(x)).forEach(x -> methodB(x));
を、ストリームに戻って要素を返し、その後、methodAを呼び出すためにそれが動作します(と、それは今の生産であります)
B.使用map()
:
list.stream().map(x -> {method1(x); return x;}).forEach(x -> methodB(x));
これはおそらく最も受け入れやすいアプローチです。
cforEach()
で2つのことを行います。
これは最も柔軟性が低く、必要に応じない可能性があります。
ストリームにマップを適用することをお勧めします。これは、例えば、このストリームの要素に与えられた、機能を適用した結果からなるストリームを返し:
IntStream.rangeClosed(40, 70).limit(20).mapToObj(i -> (Integer) i).map(item->item+3).map(item->item*2)...
(ストリームタイプStreamItemABCの項目の)
我々は、ストリームにいくつかの変更を適用していますこのようにしてメソッドをマップするメソッドに引数を渡すことはできません。
private void applyMethod(ParameterX parX) {
someStreamX().map(n -> methodX(n, parX))...
}
private StreamItemABC methodX (StreamItemABC item, ParameterX parX) {
return notification;
}
- 1. Java 8 Streamを使用して複数のレイヤーのXMLデータに異なる機能を適用する
- 2. すべてのボタンに機能を適用しますか?
- 3. java 8 listBのすべての要素をListAにマージします。
- 4. Java 8 Stream APIコレクタ - addAllは引数Objectには適用されません。オブジェクトのaddAllは未定義です
- 5. 多くの要素に同じ機能を適用します(順番に)
- 6. Java 8ストリーム。すべての要素他の要素を除いて
- 7. Java 8オプション/機能コードの最適化
- 8. GCCですべての機能にwarn_unused_resultを適用する
- 9. シーケンスのすべての要素に述語を適用する
- 10. データフレームのすべての要素に関数を適用する
- 11. フォントはすべてのラベル要素には適用されません
- 12. エクセルのすべてのセルに機能を適用する
- 13. 要素内のすべてにCSSを適用する
- 14. xsl:コメントはすべての子要素に適用されませんか?
- 15. CSSアニメーション遅延はすべての要素に適用されません
- 16. Java 8を使用してList内の要素の位置をすべて変更します。
- 17. リストのすべての要素のすべての要素に関数を適用する方法R
- 18. 次のコードをJava 8 Streamに変換するには?
- 19. Java 8ストリーム:リストの可能なすべての要素のペアを処理します
- 20. はすべての要素のメソッドとして機能します
- 21. java8の "Stream"はどのように機能しますか?
- 22. パンダはすべての列のすべての要素に適用してマップします
- 23. すでに機能しているアプリケーションを壊さずにXcodeのコードをたくさん変更する
- 24. ページを壊さずにすべてのページレベルのエラーをキャッチ
- 25. CSS3 :: selection擬似要素はすべての子要素にも適用されますか?
- 26. Stream-Java 8を使用してファイル内のテキストを置き換えます。
- 27. イベントハンドラがすべての要素で機能しない
- 28. forEach for Java 8 StreamのforEachOrdered
- 29. クラスをテーブル要素に追加せずに要素にCSSを適用する方法はありますか?
- 30. 高さ:HTML、本文、およびすべての折り返し要素に適用されても、100%は機能しません
呼び出したいメソッドは値を返しますか? –
ストリームチェーンを壊さずに何を意味するのか説明できますか?例がありますか? – Eugene