【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 件のコメント:
コメントを投稿