2017-06-20 13 views
0

Java Stream Cheat SheetJavaストリームは、Javaストリームのために、このチートシートで行く

端末操作でデータを変異させる - 私は、Javaストリームはデータを変異することができないことを理解しています。

たとえば、以下のコードでは、forEachターミナル操作を使用してデータが突然変異していますか?

List<Foo> fooList=new ArrayList<>(); 
fooList.stream() 
.filter(foo-> return foo.getSomeBoolean()) 
.forEach(foo->{ 
    foo.setSomeBoolean(false); 
}); 

forEachターミナル操作でデータに副作用がありますが、データが変更されることはありませんか?

誰かがforeachがここでデータを突然変異させる方法を説明できますか?

+6

注意:*このデータは変更できません。つまり、元のデータ構造は変更されません。***データソースではなくオブジェクトに変更を加えています。 – shmosel

+1

'java.util.stream.Stream'のdocから:そのソースと、そのソース上で集約して実行される計算操作を宣言的に記述します。 'filter'メソッドでは、Streamを別のStreamに変換し、' forEach'を使用してstreamのすべての要素を繰り返します。 'forEach'は端末操作です。 –

+0

コンパイラが対処していないこと、および実行時に例外がないという事実さえも、特定の操作が許可されていることを証明していません。重要なのは正式な仕様だけです。同じ 'Foo'インスタンスがソース' List'に複数回現れた場合でも、あなたはソースコレクションを変更していませんが、依然として*干渉*する可能性があります。 – Holger

答えて

1

fooListを変更することはできませんが、は、端末操作を使用して要素に対して副作用を実行できます。チートシートにあるように、ストリームはパイプラインであり、データ構造ではありません。データ構造ではないものを変更することはできませんが、パイプラインを流れる個々の要素を操作できます。

関連する問題