2026年2月15日日曜日

【Java進化史 第15回】Java8 〜Streamを読む練習。「左から読む」だけ〜

【Java進化史 第15回】Java8 〜Streamを読む練習。「左から読む」だけ〜


■ この記事で分かること

  • Streamを読んで「何をしているか」説明できるようになる
  • Java6以前でどう書くかが分かる
  • Streamの内部の動きと価値が分かる


■ まずは読む練習

Streamが怖いのは、何をしているのか分からないからだ。

今日は、たった1つのコードを読む。


names.stream()
     .filter(n -> n.startsWith("S"))
     .map(String::toUpperCase)
     .sorted()
     .forEach(System.out::println);

さて、これは何をしているだろう。

読むポイントはひとつ。

左から順番に読むだけ。


■ 何をしている?

左から順に、日本語にしていく。

  1. names を stream にする
  2. Sで始まるものだけ残す
  3. 大文字に変換する
  4. 並べ替える
  5. 表示する

つまり、

「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 件のコメント:

コメントを投稿

【Java進化史 第18回】Java8 〜「@」も読めなかった日

【Java進化史 第18回】Java8 〜「@」も読めなかった日〜 若手のコードを見たとき、 固まったことがある。 -> が読めない。 Streamも追えない。 そして、やたらと出てくる「@」。 なんじゃこれ? ■ @ は何者か 調べ...