ITproの読者には既にご存じの方も多いと思うが、2014年3月に「Java SE」の次期版「Java SE 8」(以下、Java 8)がリリース予定である。国内のエンタープライズ分野では「レガシーJava」が多いとされ、現行版の「Java SE 7」に移行しているユーザーすら少数派と聞く。Java 8といっても遠い話のように感じる方も多いかもしれない。

 しかし、Java 8はJavaにとって一つの大きなマイルストーンとなる。関数型プログラミングに由来する「ラムダ(lambda)式」なる構文が導入されるのだ。

 Javaをよく知る技術者の方の中には、「いや、Java 8のラムダ式は関数型プログラミングのために導入されたのではない」と主張される方がいるだろう。この点については後ほど触れたいと思うが、「ラムダ式が何のために導入されたか」はさておき、ラムダ式という記法そのものが「関数型に由来する」ことは紛れもない事実である。厳密には、数理論理学の体系の一種である「λ計算」に由来する。λ計算は、関数型プログラミングの基盤理論でもある(「すべてのものは関数である」を参照)。

 もっとも、Java 8はラムダ式が何に由来しているかなど知らなくとも、十分使える。主眼はコレクション操作のAPI(アプリケーション・プログラミング・インタフェース)を進化させる点にある。具体的には、Java 8では新たに「Stream API」というコレクション操作APIが導入され、データの集合であるコレクションから特定の条件に合致した要素のみを抽出するといった処理を簡便に記述できるようになる。

 これまでfor文などの繰り返し構造(外部イテレータ)で、要素の一つずつにアクセスし、条件に合致しているかをしらみつぶしに判断するスタイルで記述していたものを、Java 8では、よりシンプルなコレクション操作APIに置き換えることができる。繰り返し構造が直接目に見える形とならない、いわゆる「内部イテレータ」と呼ばれる方式だ。内部イテレータにおいて、どういう条件で要素を抽出するかといった要素への処理方法を指定するのに、Java 8ではラムダ式を使う。大まかに言えば、Stream APIの引数にラムダ式を渡し、そのラムダ式に要素の抽出条件や処理方法などが書かれているという具合だ。実務上は、深く考えず、そういうAPIなのだと割り切ってしまえば、関数型が由来だなどと気にする必要はないかもしれない。

「関数型」とは何か

 さて、タイトルにある「Java 8は関数型なのか」であるが、タイトルに掲げておきながらこんなことを言うのは恐縮だが、実はこの問い自体が適切ではない。個々のプログラミング言語に対して「関数型なのかどうか」を問うのは適切でないからだ。

 筆者は昨年、同じ「記者の眼」欄で、「関数型プログラミングは本当に難しいのか」という記事を書いた。

 理由をそちらでまとめたので、詳細は同記事を見ていただきたいが、改めて説明すると、「関数型」というのは言語ではなく、プログラミングスタイルに対する形容だ。このため、言語そのものが「関数型かどうか」を議論するのは適切ではない。関数型かどうかは、その言語を使って、個々のプログラムがどのように書かれているかによって初めて決まる。ある意味、記述する人に依存した問題なのだ。

 ただし、個々の言語によって、関数型のプログラミングスタイルの実現のしやすさに差はある。ある言語が「関数型かどうか」というゼロイチではなく、関数型のプログラミングスタイルを“どのくらい”実現しやすいかについては議論が成立するといえる。