【Java進化史 第11回】Java8 〜なんだこの→は?ラムダ式の必要性〜(理論編)
■ この記事で分かること
- 若手のラムダ式がなぜ読めなかったのか
- ラムダ式で「何が消えて」「何が残ったのか」
- なぜInterfaceは残るのか
- それでもJavaらしさが失われていない理由
■ 若手のコードで、私は固まった
コードレビューで見た一行。
Calculator add = (x, y) -> x + y;
System.out.println(add.calc(3, 5));
……?
矢印?
これがJava?
私の知っているJavaは、 もっと重厚で、もっと“クラス中心”だった。
■ 私が知っているJava(Java7まで)
同じ処理を、Java7で書くとこうなる。
public class Main {
interface Calculator {
int calc(int x, int y);
}
public static void main(String[] args) {
Calculator add = new Calculator() {
@Override
public int calc(int x, int y) {
return x + y;
}
};
System.out.println(add.calc(3, 5));
}
}
やりたいことは単純だ。
x + y
しかし実際には、
- Interfaceを書く
- 匿名クラスを書く
- メソッドを実装する
「計算」よりも、「入れ物」の方が目立っている。
■ Java8ではどうなったか
public class Main {
interface Calculator {
int calc(int x, int y);
}
public static void main(String[] args) {
Calculator add = (x, y) -> x + y;
System.out.println(add.calc(3, 5));
}
}
出力は同じ。
8
消えたのは、これだ。
new Calculator() {
@Override
public int calc(int x, int y) {
return x + y;
}
}
■ 何が消えて、何が残ったのか
消えたもの:
- 匿名クラス
- ボイラープレートコード
残ったもの:
- Interface
- 型
ここが重要だ。
ラムダ式は、Interfaceを消していない。
Javaはあくまで静的型付け言語。 型がなければ成立しない。
Calculator add = (x, y) -> x + y;
この左側の Calculator があるから、 ラムダは意味を持つ。
■ Interfaceを残すのが、Javaらしい
Java8は変わった。
しかし、捨てなかった。
Interfaceという「契約」は残した。
これはオブジェクト指向の王道だ。
ラムダは“関数”ではない。
Interfaceの実装を、簡潔に書ける仕組みだ。
だからJavaは、 動的言語になったわけではない。
あくまで、 型と契約の上に立った進化だった。
■ まとめ
- ラムダ式はInterfaceを消さない
- 消えたのは匿名クラスの冗長さ
- Javaらしさは残っている
→ は革命ではない。
しかし、 Javaを書く感覚を確実に軽くした。
■ 次回予告
【Java進化史 第12回】
〜ラムダ式を分解して読む〜
- なぜ型を書かなくていい?
- どこで型推論している?
- 「関数型インターフェース」とは何か?
→ の裏側を、技術的に解体する。
0 件のコメント:
コメントを投稿