回答編集履歴
2
swordoneさんのdata.forEach()は副作用ではないという意見に同意
test
CHANGED
@@ -56,9 +56,7 @@
|
|
56
56
|
|
57
57
|
|
58
58
|
|
59
|
-
|
59
|
+
data.stream().forEach()は元のデータを書き換える副作用があります(新しい出力を作らず終端処理で自己更新する)。(*swordoneさんのdata.forEach()は副作用ではないという意見に同意。以後、Stream処理が入力を汚すという意味で「副作用」を使います)
|
60
|
-
|
61
|
-
|
62
60
|
|
63
61
|
|
64
62
|
|
1
訂正とStreamの利用を追記
test
CHANGED
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
|
40
40
|
|
41
|
-
forEach()は
|
41
|
+
forEach()はCollectionとStreamの両方にあります。どちらも引数に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にしておけば、誤ってコレクションを更新しても例外が発生する。
|