モノのストリームがあり、それらを途中で「強化」したい場合peek()
、これを行うために使用できます。たとえば:
streamOfThings.peek(this::thingMutator).forEach(this::someConsumer);
コードのこの時点でthingMutator
モノを変更することは正しい動作であると仮定します。たとえば、メソッドは「lastProcessed」フィールドを現在の時間に設定できます。
ただし、peek()
ほとんどのコンテキストでは、「見て、触れないでください」という意味です。
ストリーム要素の突然変異にアンチパターンを使用peek()
していますか?
編集:
より一般的な代替アプローチは、消費者を変換することです。
private void thingMutator(Thing thing) {
thing.setLastProcessed(System.currentTimeMillis());
}
パラメータを返す関数に:
private Thing thingMutator(Thing thing) {
thing.setLastProcessed(currentTimeMillis());
return thing;
}
map()
代わりに使用します:
stream.map(this::thingMutator)...
しかし、それは機能的なコード(return
)を導入しpeek()
、同じオブジェクトを返すことを知っているので、それがより明確であるとは確信していませんがmap()
、同じクラスのオブジェクトであることは一目でさえわかりません。
さらに、peek()
あなたは突然変異するラムダを持つことができmap()
ますが、列車の残骸を構築する必要があります。比較する:
stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...)
stream.map(t -> {t.setLastProcessed(currentTimeMillis()); return t;}).forEach(...)
私は思うpeek()
ので、何の「神秘的」副作用はありません、バージョンが明確で、かつラムダは明らかに変異されます。同様に、メソッド参照が使用され、メソッドの名前が明らかに突然変異を暗示している場合、それも明確で明白です。
個人的には、peek()
突然変異に使うことをためらわない-非常に便利だと思う。
peek
要素を動的に生成するストリームで使用しましたか?それでも機能しますか、それとも変更は失われますか?ストリームの要素を変更することは私には信頼できません。
List<Thing> list; things.stream().peek(list::add).forEach(...);
。非常に便利です。最近。公開用の情報を追加するために使用しました:Map<Thing, Long> timestamps = ...; return things.stream().peek(t -> t.setTimestamp(timestamp.get(t))).collect(toList());
。この例を実行する他の方法があることは知っていますが、ここでは非常に単純化しすぎています。を使用peek()
すると、よりコンパクトでエレガントなコードが生成されます。読みやすさは別として、この質問はあなたが何を提起したかに関するものです。安全/信頼できますか?
peek
ますか?stackoverflowについても同様の質問がありますので、それを見てフィードバックをお寄せください。ありがとう。stackoverflow.com/questions/47356992/...