限られた数の値をセットにストリーミングしようとしていますが、制限を適用する前に新しい要素であることを確認する必要があります。たとえば:add()
は両方それがコレクションに新しいのかどうかの要素とレポートを追加することができますので、シーケンシャルストリーム操作に副作用がありますか?
Set<Integer> destination = ...
Set<Integer> source = ...
source.stream()
.filter(i -> !destination.contains(i))
.limit(10)
.forEach(destination::add);
しかし、冗長チェックは、私を悩ませています。だから私はこれを行うことを考えていた:
source.stream()
.filter(destination::add)
.limit(10)
.forEach(i -> {}); // no-op terminal operation to force evaluation
がハック端末操作を無視すると、一般的に推奨されて副作用、とフィルタ操作を使用しての問題があります。私は、並列ストリームで副作用を伴うmap()
とfilter()
を使用することが安全でない理由を理解しています。私の質問は、この場合のように連続したストリームで受け入れられるだろうか?そうでない場合は、どうしてですか?
あなたは私のシナリオを誤解していると思います。 'source'はセットなので、重複する要素は含まれません。私は 'destination 'には存在しない' source'の要素を追加しようとしています。だから私は最初の解決策はまだ動作すると思います。しかし、あなたの全体的なポイントは興味深いものです。つまり、ストリーム要素がパイプライン全体を一度に通過しない可能性があります。あなたはそのための情報源を持っていますか、あるいはそれとは反対にドキュメンテーションの欠如に頼っていますか? – shmosel
逆に、ストリームの多くの最適化がチャンク内の要素を処理するという事実は、*と*の記載が不足しています。あなたが書いたコードは今日はうまくいくようですが、新しいJavaのバージョンや他の実装ではうまく変わる可能性のあるものに依存しています。 –
私は実際に小切手の目的を誤解しました。それに応じて回答を編集しました。 –