2017-03-22 30 views
2

私はこのようなコードを持っています。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; 
    } 
    
  • +0

    .foreachに関するルールの正確な情報源はありますか?それが作業しているオブジェクトの変数、またはあらゆる種類の変数についてですか? (「不変変数を更新する」という意味では、「不変変数の更新」と言っても少し奇妙です)とにかく、forループを明示的なコレクション管理とともに使用することをお勧めします。ここでもっと明確にする。 –

    +1

    重要な点は、*干渉*を避けなければならないことです。同じ 'Thing'インスタンスがソースコレクションに複数回現れたときに実行することができますが、アプリケーションロジックのためにそのインスタンスを排除できると仮定します。次に、 'thingRepo.save(...)'が 'thingRepo'の状態をどのように変更するかによって異なります。一般的に、 'forEach'を使ってリストを生成する前に、ストリームを使用しないことを検討します。後者は、' for'ループより簡単で洗練されたコードを生成しません。 – Holger

    答えて

    2

    可変状態とは言わないのですか?あなたの場合、メソッドの中でリストを宣言してからforEachを使用すれば、すべて問題ありません。 2番目の答えhereは、あなたがしようとしていることを正確に示しています。

    +0

    私は考えていましたが、例では明らかではなかったので、「共有」によって何を意味しているか分かりませんでした。可能であれば、一般的に共有可能な状態を変更したいとは思っていません:) 2番目の答えは、まさに私が(注文を放棄して) –

    1

    あなたがすべてでそれを変異させていない場合は、全く新しいListを収集する理由にはほとんどがあります。あなたのユースケースは、基本的にコレクション内のすべての要素を繰り返し処理しており、単にfor-eachを使用することで実現できます。

    hingRepo.save(thing)がオブジェクトを変異させても、同じコレクションを返すことができますが、この時点では、hingRepo.save(thing)はそれを示唆していない隠れた変異があります。

    +0

    保存オブジェクトが変異しています。 与えられたエンティティを保存します。保存操作によってエンティティインスタンスが完全に変更された可能性があるため、返されたインスタンスを次の操作に使用します。 –

    +1

    @ViktorMellgrenそれでは、新しいコレクション全体を返すのは大丈夫です。しかし、これは実際にオブジェクトの以前の値と現在の値を持つ2つのコレクションを実際に必要とするかどうかによって大きく異なります。 –

    +0

    私は:)設定されているIDが必要です –

    関連する問題