2017-05-05 4 views
4

Javaでは、ストリームチェーンを壊さずにストリームのすべての要素に機能を適用する方法はありますか?私はforEachを呼び出すことができますが、そのメソッドはストリームではなくvoidを返します。Java 8では、ストリームチェーンを壊さずにStreamのすべての要素に機能を適用します。

+0

呼び出したいメソッドは値を返しますか? –

+0

ストリームチェーンを壊さずに何を意味するのか説明できますか?例がありますか? – Eugene

答えて

2

Streammap()機能を探しています。

例:

List<String> strings = stream 
.map(Object::toString) 
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll); 
+0

マップを使用する場合は、複数の行を使用する必要があります。 myStream.map(obj - > {obj.foo(); return obj;})のようなものです。私はそこに1行の解決策があるのだろうかと思っていました。 – alexgbelov

+0

そこのメソッドを参照することもできます。私のmodをチェックしてください。 – csenga

0

私はあなたがStream.peekを探していると思います。しかし、主にデバッグ方法として設計されているので、慎重にドキュメントを読んでください。ドキュメントから:

この方法では、あなたは彼らがpeekに渡されたアクションはnon interferingでなければならないパイプライン

に特定のポイントを過ぎて流れるよう要素を見たい場合は、デバッグをサポートするために主に存在しています。

1

あなたはbreaking the stream chainによって何を意味するのか全くわからないが、Streamを返しStream上の任意の操作がブレークまたはあなたのストリームを消費しません。ストリームはterminal operationsによって消費され、forEachStream<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である必要があります。

5

少なくとも3つの方法があります。

A.使用peek():サンプルコードのために、私はあなたが2消費者法methodAmethodB呼びたいと想定しましたドキュメントは唯一の「デバッグ」のためにそれを使用すると言うが、

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つのことを行います。

これは最も柔軟性が低く、必要に応じない可能性があります。

+0

'map'の関数で副作用を伴うアクションを実行し、そのような(非デバッグ)副作用のために' peek'を使うことの意味は基本的に同じです。 – Holger

+0

@Holger誰が副作用について何か言ったのですか? – Bohemian

+0

'method1(x);'の呼び出しは、副作用がなければ、全く役に立たないでしょう。 – Holger

0

ストリームにマップを適用することをお勧めします。これは、例えば、このストリームの要素に与えられた、機能を適用した結果からなるストリームを返し:

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; 
} 
関連する問題