2026年2月14日土曜日

【Java進化史 第12回】Java8 〜ラムダ式を分解して読む〜(読み方編)

【Java進化史 第12回】Java8 〜ラムダ式を分解して読む〜(読み方編)

■ この記事で分かること

  • ラムダ式をどう頭の中で変換すれば読めるか
  • → の意味をシンプルに理解する方法
  • 若手のコードを怖がらずに読むコツ

■ 50代後半になると、脳は少し保守的になる

正直に言う。

50も後半になると、 新しい文法を見るだけで、少し身構える。

また覚え直すのか?

若い頃のように、 何でも吸収できる感覚は、もうない。

そして、→ を見る。


(x, y) -> x + y

……やめてくれ、と思った。

だが、あることに気づいた。

これは新しい知識ではない。

昔の知識に変換すればいいだけだ。


■ → はたった2つの意味しかない

難しく見えるが、本質は単純だ。

  • 左側: メソッドの引数
  • 右側: メソッドの処理本体

それだけだ。

→ を見たら、心の中でこう唱える。

「左が引数。右がメソッド本体。」


■ 匿名クラスに戻して読む

たとえば次のコード。


list.forEach(x -> System.out.println(x));

これは何をしているか?

落ち着いて、Java7に戻してみる。


list.forEach(new Consumer<String>() {
    @Override
    public void accept(String x) {
        System.out.println(x);
    }
});

つまり、

  • x は accept メソッドの引数
  • 右側は accept の中身

匿名クラスを圧縮しているだけ。

あなたはこの書き方を、何年もしてきた。

知らないのではない。

形が変わっただけだ。


■ 型は消えていない


Calculator add = (x, y) -> x + y;

なぜ型を書かなくていいのか?

答えは単純だ。

左側の型が、メソッドの形を決めているから。

Javaは動的言語になっていない。

型は消えていない。

見えなくなっただけだ。


■ 練習問題①

次のラムダ式を、Java7風に書き直してみよう。


Comparator<String> comp = (a, b) -> a.length() - b.length();

答え:


Comparator<String> comp = new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return a.length() - b.length();
    }
};

■ 練習問題②

次のコードは何をしているか、匿名クラスに戻してみよう。


Runnable r = () -> System.out.println("Hello");

答え:


Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello");
    }
};

→ の左が空なのは、引数がないからだ。


■ まとめ

  • → は「左が引数」「右が処理」
  • 匿名クラスに戻せば読める
  • 新しいことを覚える必要はない

新しい文法に怯える必要はない。

あなたはすでに、知っている。

ラムダ式は、 長年書いてきたJavaの圧縮形にすぎない。

展開すれば、見慣れた景色になる。


■ 次回予告

【Java進化史 第13回】
〜ラムダ式はどう書くのか〜(実践編)

読む側から、書く側へ。




0 件のコメント:

コメントを投稿

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

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