私はこのようなコードを持っています。Javaストリームが副作用でマップされ、結果リストを収集またはforeachして移入する
私はこれに関して2つの矛盾する(?) "ルール"を読んでいます。 http://files.zeroturnaround.com/pdf/zt_java8_streams_cheat_sheet.pdfで述べたように.map
は副作用
.foreach
が 更新変更可能な変数はならないことを(私は、その後、foreachのを使用して 結果リストを移入するリファクタリング場合はそのことを壊すこと)を持つべきではないこと
ストリームを使用してもリストを返すようにするにはどうすればできますか?ストリームをスキップするだけですか?
@Transactional
public Collection<Thing> save(Collection<Thing> things) {
return things.stream().map(this::save).collect(Collectors.toList());
}
@Transactional
public Thing save(Thing thing) {
// org.springframework.data.repository.CrudRepository.save
// Saves a given entity. Use the returned instance for further operations as the save operation might have changed the entity instance completely.
Thing saved = thingRepo.save(thing);
return saved;
}
.foreachに関するルールの正確な情報源はありますか?それが作業しているオブジェクトの変数、またはあらゆる種類の変数についてですか? (「不変変数を更新する」という意味では、「不変変数の更新」と言っても少し奇妙です)とにかく、forループを明示的なコレクション管理とともに使用することをお勧めします。ここでもっと明確にする。 –
重要な点は、*干渉*を避けなければならないことです。同じ 'Thing'インスタンスがソースコレクションに複数回現れたときに実行することができますが、アプリケーションロジックのためにそのインスタンスを排除できると仮定します。次に、 'thingRepo.save(...)'が 'thingRepo'の状態をどのように変更するかによって異なります。一般的に、 'forEach'を使ってリストを生成する前に、ストリームを使用しないことを検討します。後者は、' for'ループより簡単で洗練されたコードを生成しません。 – Holger