【Java進化史 第15回】Java8 〜Streamを読む練習。「左から読む」だけ〜
■ この記事で分かること
- Streamを読んで「何をしているか」説明できるようになる
- Java6以前でどう書くかが分かる
- Streamの内部の動きと価値が分かる
■ まずは読む練習
Streamが怖いのは、何をしているのか分からないからだ。
今日は、たった1つのコードを読む。
names.stream()
.filter(n -> n.startsWith("S"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
さて、これは何をしているだろう。
読むポイントはひとつ。
左から順番に読むだけ。
■ 何をしている?
左から順に、日本語にしていく。
- names を stream にする
- Sで始まるものだけ残す
- 大文字に変換する
- 並べ替える
- 表示する
つまり、
「Sで始まる名前を大文字にして、並べ替えて表示している」
まずは、これが言えればいい。
■ Java6以前ならどう書くか
同じことを、Java6までの書き方で書いてみる。
List<String> result = new ArrayList<String>();
for (String name : names) {
if (name.startsWith("S")) {
result.add(name.toUpperCase());
}
}
Collections.sort(result);
for (String name : result) {
System.out.println(name);
}
やっていることは同じだ。
- 回す
- 条件を確認する
- 変換する
- 並べ替える
- 出力する
Streamは、これを一本の流れで書いているだけだ。
まずはここまで理解できれば十分だ。
■ では内部ではどう動くのか
Java6までなら、基本はこうだ。
for (...) {
// 1件ずつ順番に処理
}
もし並列化したければ、
- スレッドを作る
- 処理を分割する
- 同期を取る
- 競合を防ぐ
あの、バグを生みやすい並列処理を、自分で書く必要があった。
Streamは違う。
names.parallelStream()
.filter(...)
.map(...)
.forEach(...);
これだけで、内部で自動的に分割され、 並列処理される。
開発者は並列化のコードを書かなくていい。
回す責任だけでなく、 並列化の責任もライブラリに渡した。
通常の stream() の場合は順番に処理される。
だが重要なのは、
Streamは1件ずつかもしれないし、並列かもしれない。 それを意識しなくていい設計が価値だ。
「どう回すか」ではなく、 「何をするか」だけを書く。
それがJava8の思想である。
■ まとめ
- まずは左から順番に読む
- 日本語にできれば理解できている
- Java6で書き直せるなら、もう怖くない
- 並列化を自分で書かなくていいのが本質
■ 次回予告
では、実際にfor文からStreamへ書き換えてみる。
次回、「Streamを書いてみる」。
0 件のコメント:
コメントを投稿