2015年12月から始まった本連載ですが、12月掲載分はJavaOneレポートだったので、実質的にはこの2016年1月からとなります。

 2015年までの連載「Java技術最前線」では1つのトピックに関して網羅性を重視して解説していましたが、最新Java情報局では方向性を変更し、トピックを2~3カ月でまとめていくようにしたいと思います。

 また、先月はJavaOneレポートで変則的に記事の公開をしましたが、今後は原則として隔週で公開する予定です。

今後ともおつきあいのほど、よろしくお願いします。

Project Lambda再び

さて、新連載の初めに取り上げるのは、Project Lambdaです。

「えっ、また」と言われる方もいらっしゃるかもしれません。かつてJava技術最前線でProject Lambdaを取り上げましたが、それから2年たった現在、Java SE 8の普及はそれほど進んでいません。その一方で、ラムダ式やStream APIの知見は広がっています。

 そこで、言語仕様やAPIの紹介は最小限にし、どうやって活用するかをメインにして再度取り上げていきます。

 今回はProject Lambdaの一番基本となるラムダ式について。特に自作するクラスやライブラリーでラムダ式をどのように扱っていくかを紹介していきます。

ラムダ式とは何か

Project Lambdaでは言語仕様の変更と、新しいAPIの導入の2本立てで進められました。前者の言語仕様変更のメインとなるのがラムダ式です。その他に、インタフェースのデフォルトメソッド、メソッド参照などが導入されました。

後者のAPIはStream APIです。Stream APIについては次回から取り上げます。

さて、ラムダ式です。巷ではラムダ式が難しいという声も聞こえてくるのですが、ラムダ式自体はとても簡単です。

例えば、IDEを使用すれば、既存のコードを自動的にラムダ式に変換することも可能です。つまり、ラムダ式は自動変換できるぐらいの変更でしかないのです。

では、まず簡単にラムダ式の仕様を紹介しましょう。

ラムダ式は関数型インタフェースを実装した匿名クラスとみなせます。

関数型インタフェースは実装すべきメソッドが1つだけのインタフェースです。特に言語仕様的に追加されたということではありません。例えば、既存のインタフェースの中でも、java.lang.Runnableインタフェースのように実装すべきメソッドが1つのインタフェースであれば関数型インタフェースとなります。

 Java SE 8では汎用に使用できる関数型インタフェースが、java.util.functionパッケージで提供されています。例えば、FunctionインタフェースやPredicateインタフェースなどがあります。

 これらの関数型インタフェースのメソッドを実装して、インタフェースのオブジェクトを生成するのがラムダ式です。