第9章. 関数型プログラミングテクニック:関数型インタフェース、ストリーム、並列コレクション
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
9.0 はじめに
Javaはオブジェクト指向(OO)言語である。最近、関数型プログラミング(FP)が注目されている。 FPの定義はFP言語ほど多くないかもしれないが、それに近い。 ウィキペディアの関数型プログラミングの定義は以下の通り(https://en.wikipedia.org/wiki/Functional_programming、2013年12月閲覧):
計算を数学関数の評価として扱い、状態や可変性データを避ける。関数型プログラミングは、プログラムの状態ではなく、入力にのみ依存する結果を生成する関数、つまり純粋な数学関数を重視する。関数型プログラミングは宣言型のプログラミングパラダイムであり、プログラミングは式で行われる。関数型コードでは、関数の出力値は関数に入力される引数のみに依存するため、引数xに同じ値を指定して関数fを2回呼び出すと、2回とも同じ結果f(x)が得られる。副作用、つまり関数の入力に依存しない状態の変化を排除することで、プログラムの振る舞いを理解し予測することが非常に容易になる。
FPパラダイムからどのように利点を得ることができるのだろうか? 一つの方法は、FP言語の使用に切り替えることである、1 代表的なものとしては、Haskell、Idris、Ocaml、Erlang、Julia、LISPファミリーなどがある。 しかし、これらのほとんどはJavaのエコシステムから離れる必要がある。 Scalaや Clojureを使うことも検討できる。JVMベースの言語であり、OO言語のコンテキストで関数型プログラミングをサポートしている。 JVM用の最新のJavaライクな言語であるKotlinもある。
しかし、これはJavaクックブックなのだから、Java言語のままで関数型プログラミングの利点をできるだけ多く得ようとしていることは想像がつくだろう。 FPの特徴には以下のようなものがある:
-
副作用がなく、その結果が入力にのみ依存し、プログラム内の他の場所の可変性状態には依存しない純粋関数。
-
ファーストクラス関数(データとしての関数など)
-
不変性データ
-
再帰と遅延評価の多用
純粋関数は完全にself-containedであり、その演算子は入力パラメータと内部ロジックにのみ依存し、プログラムの他の部分の変数状態には依存しない。これは、Javaのような命令型言語の教育を受けた人々には受け入れがたいことかもしれないが、プログラムのテストや正しさの確認が非常に簡単になる!つまり、プログラム内で他に何が起こっていても(複数のスレッドがあっても)、computeValue(27) のようなメソッド呼び出しは常に、無条件に、毎回同じ値を返すということだ(もちろん、現在時刻やランダムシードなど、グローバルな状態であるものは例外である)。
厳密には正しくないが、この章では関数と メソッドという言葉を使い分けている。FPの人たちは関数という言葉を数学的な関数の意味で使うが、Javaではメソッドは単に呼び出すことができるコードを意味する(Javaのメソッド呼び出しは、OO的なものの見方では、オブジェクトに送られるメッセージとも呼ばれる)。
データとしての関数とは、関数であるオブジェクトを作成し、それを別の関数に渡したり、別の関数を返す関数を書いたりできることを意味する。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access