Javaのラムダ式の考え方
Javaのラムダ式の考え方について理解できた内容をラフなメモ。
間違っていたら後で直す。
【参考】
Javaにおけるラムダ式とメソッド参照
徹底解説! Javaのラムダ式はどういうもので、どう使えばいいのか!
【Java】内部クラス(インナークラス)の使い方(static class) | 侍エンジニアブログ
Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ: プログラマの思索
JavaSilverの感想~Javaはオブジェクト指向と関数型言語の2つの性格を持つ: プログラマの思索
Java8以後は、オブジェクト指向言語ではなく関数型言語とみなした方がいいと感じた。
理由は、ラムダ式のような関数型言語の特徴を取り入れたAPIを多数取り込んでいるからだ。
マルチスレッド、Optional、Stream、IOなどの新しいAPIに触れてみると、ことごとくラムダ式を使って副作用をなくすような処理でいかに書くのか、を目指しているような気がする。
Javaのラムダ式は、RubyやPythonのクロージャみたいなものだと思う。
ただし、Javaのラムダ式では、ローカル変数は実質finalなので更新しようとするとコンパイルエラーになる。
この特徴は、Rubyのブロック、Pythonのクロージャのようなレキシカルスコープとは異なる。
Javaのラムダ式は2つの理解方法がある。
1つ目は、Javaのラムダ式は、内部クラス(Inner class)や匿名クラス(anonymous class)から生まれたものと思えばいい、
ラムダ式のイメージはこんな感じ。
依存しあったクラスが2つある。
→2つのうち1つのクラスを、内部クラスにして1つのソースファイルに統合する。
→static内部クラスにして、内部クラスのインスタンス化を廃止する。
→static内部クラスをメソッド内に取り込んで、ローカルクラスに置き換える。
→メソッド内のローカルクラスを匿名クラスに置き換える。
→匿名クラスをラムダ式に置き換えると出来上がり。
Javaの内部クラス、局所クラス、匿名クラスのような記法は現場であまり使わないから、どこで使うのだろうか、と思っていたが、ラムダ式を生み出すための前段階の仕組みと思えば自然に思える。
徹底解説! Javaのラムダ式はどういうもので、どう使えばいいのか!
2つ目は、「Javaのラムダ式は、関数型インターフェイスを実装したクラスのインスタンスを、簡単に作るための文法」。
つまり、Javaのラムダ式は関数型インフェーエイスを宣言し、実装したクラスからインスタンスを生成する仕組み。
徹底解説! Javaのラムダ式はどういうもので、どう使えばいいのか!
関数型インフェーエイスは、抽象メソッド1個だけを持つのがミソ。
FunctionalInterfaceアノテーションを付けたインターフェイスでは、自動的に関数型インフェーエイスになるが、抽象メソッドを2つ宣言したり、defaultメソッドで実装すると、関数型インフェーエイスではなくコンパイルエラーになる。
では、なぜラムダ式があると便利なのか?
マルチスレッドやStreamAPIでラムダ式を書いていると、処理の宣言と実装を1箇所に書けるのがメリットのように思う。
いちいち、別クラスを宣言して、インスタンスを生成して、メソッドを呼び出すみたいな面倒な処理をたくさん書かなくていい。
ラムダ式を使うと、Factoryクラスは不要になる。
() -> new A()のようなラムダ式を簡単に埋め込めるからだ。
ラムダ式を使うと、Strategyパターンの行数を減らせる。
ポリモルフィズムを使って、それぞれの処理を実装し、インスタンスを生成する部分をラムダ式で1行にまとめられるからだ。
「関数型インターフェイスには1つしか抽象メソッドがないので、戻り値・引数の型と順番を、関数型インターフェイスの型からJavaコンパイラが推測できます。この仕組みを型推論といいます。 」という指摘から、関数型言語の特徴である型推論をJavaでも実現できる。
Haskellと似ているのかな。
実際のエンタープライズJavaの開発現場では、ラムダ式やストリームAPIは禁止されているコーディングルールが多いかもしれない。
でも、Javaに限らず、現代の殆どのプログラミング言語に関数型言語の特徴が盛り込まれているので、今後もチェックしてみる。
残りは、モナドを理解したい。
| 固定リンク
「プログラミング」カテゴリの記事
- Javaのモジュールシステムの考え方をまとめてみた(2022.10.21)
- Javaのモジュールシステムは複雑性をより増している(2022.09.10)
- Javaはなぜ関数型言語になろうとしているのか(2022.09.02)
- Javaのラムダ式の考え方(2022.08.10)
- Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ(2022.08.06)
コメント