回答編集履歴

2

swordoneさんのdata.forEach()は副作用ではないという意見に同意

2020/02/07 04:40

投稿

xebme
xebme

スコア1083

test CHANGED
@@ -56,9 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- どちらも元のデータを書き換える副作用があります。Collectionの更新メソッド呼ぶから。
59
+ data.stream().forEach()は元のデータを書き換える副作用があります(新しい出力を作らず終端処理で自己更新する)(*swordoneさんのdata.forEach()は副作用ではないという意見に同意。以後、Stream処理が入力汚すという意味で「副作用」を使います)
60
-
61
-
62
60
 
63
61
 
64
62
 

1

訂正とStreamの利用を追記

2020/02/07 04:40

投稿

xebme
xebme

スコア1083

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
 
41
- forEach()はコレクションストリームの両方にあります。どちらも引数にConsumerを取ります。違いは[The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach)に書かれているとおり、コレクションが内部的にIteratorを使用するのに対してStreamはListを順にトラバースします。Iteratorを書き換えると処理順が変わります。この例でその必要はなさそうです。
41
+ forEach()はCollectionStreamの両方にあります。どちらも引数にConsumerを取ります。違いは[The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach)に書かれているとおり、Collectionが内部的にIteratorを使用するのに対してStreamはListを順にトラバースします。Iteratorを書き換えると処理順が変わります。この例でその必要はなさそうです。
42
42
 
43
43
 
44
44
 
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- どちらも元のデータを書き換える副作用があります。
59
+ どちらも元のデータを書き換える副作用があります。Collectionの更新メソッドを呼ぶから。
60
60
 
61
61
 
62
62
 
@@ -70,14 +70,6 @@
70
70
 
71
71
 
72
72
 
73
- > ③ stream apiを使うとしたら、どのように元のListにキャストするのでしょうか?
74
-
75
-
76
-
77
- すでに(List<Integer>)のStreamになっているのでキャストできません。`.collect(Collectors.toList())`で、新しく外側のListを作ってもとの中身を格納します。
78
-
79
-
80
-
81
73
  ```Java
82
74
 
83
75
  data.stream().map(e -> {e.add(999);return e;}).collect(Collectors.toList());
@@ -88,11 +80,21 @@
88
80
 
89
81
 
90
82
 
83
+ > ③ stream apiを使うとしたら、どのように元のListにキャストするのでしょうか?
84
+
85
+
86
+
87
+ すでに(List<Integer>)のStreamになっているのでキャストできません。`.collect(Collectors.toList())`で、新しく外側のListを作ってもとの中身を格納します。
88
+
89
+
90
+
91
+
92
+
91
93
  **すべてを作り直す**
92
94
 
93
95
 
94
96
 
95
- 中身をすべてコピーして新しく作るやり方です。入力はそのまま残り、副作用はありません。
97
+ 中身をすべてコピーして新しく作るやり方です。入力はそのまま残り、副作用はありません。この方法だと`data`を作る時に`ArrayList::new`が不要になります。
96
98
 
97
99
 
98
100
 
@@ -117,3 +119,11 @@
117
119
  - Streamは、filter/mapなどのメソッドチェーンが使えるので、データを加工するならStreamを使う
118
120
 
119
121
  - Collectionは、Iteratorを書き換えて、処理の順番を変えることができる
122
+
123
+
124
+
125
+ **Streamの利用**
126
+
127
+
128
+
129
+ Streamhは並行処理で利用することがあり、副作用が起きないようにimmutableなコレクションを扱うほうがよい。また、immutableにしておけば、誤ってコレクションを更新しても例外が発生する。