【Java進化史 第16回】Java8 〜Streamは「どうやるか」ではなく「何をやるか」〜
前回は、Streamを「左から読む」練習をしました。
filter → map → forEach。
左から順番に読めばいい。
それだけで、若手の1行が読めるようになる。
でも、まだモヤモヤが残る
なぜ、こう書くのか。
Java6までの自分には、 for文のほうが自然でした。
for (Employee e : list) {
if (e.isActive()) {
System.out.println(e.getName());
}
}
順番も、処理も、全部自分で書いている。
安心感があります。
Streamは「何をやるか」だけを書く
list.stream()
.filter(e -> e.isActive())
.map(e -> e.getName())
.forEach(System.out::println);
このコードをよく見ると、 回し方は書いていません。
- どこから回すか
- どうやって回すか
- 順番をどう制御するか
何も書いていない。
書いているのは、
- 条件で絞る
- 名前に変換する
- 出力する
「何をするか」だけです。
動きは1件ずつ“かもしれない”
Streamは内部で、
要素1 → filter → map → forEach
要素2 → filter → map → forEach
...
のように流れていきます。
でも、それを意識しなくていい。
1件ずつ処理するかもしれないし、 並列になるかもしれない。
自分は「どうやるか」を考えなくていい。
これが、Streamの価値です。
オブジェクト指向の延長だった
Javaは昔から、 実装を隠してきました。
Collectionもそう。
インターフェースで定義し、 中身は隠す。
Streamも同じです。
処理のやり方は任せる。
自分は、やりたいことを書く。
そう考えると、 少しだけ腹に落ちました。
次回予告
次回は、collectとforEachの違い。
「結果を返す」のはどちらなのか。
ここが分かると、Streamは完成します。
0 件のコメント:
コメントを投稿