今年は、プログラミングの機会は(業務上)少なかったものの、好きな言語・Javaの案件に一年間携わることができました。そんな2017年の締めくくりとして、Javaをテーマとした記事を書きたいと思います。今回のテーマについて今年9月には待望のJava9が正式リリースされましたが、まだまだ現場では、Java8で開発・運用されている案件が多いと思います。そこで今回は、Java8の主な新機能を、あらためて振り返ってみます。現場で何か新しいことに取り組むキッカケ作りができたら嬉しいです。(私も使いこなせるよう頑張ります!)Oracleのサイトから以下の機能をピックアップして、2回に分けてお送りします。API」についても触れる予定です。ラムダ式Java8の目玉機能と言う声も高いラムダ式。Java8で「関数型インタフェース」の実装を簡単に実現するのが、このラムダ式です。関数型インタフェースとは、抽象メソッドが1つだけあるインタフェースを指します。name);}@FunctionalInterfaceアノテーションは必須ではなく、条件を満たせば自動的に関数型インタフェースと認識されます。指定しておくと、コンパイル時に条件を満たさない場合はコンパイルエラーとなって教えてくれるため、問題がなければ指定しておいた方が良いかと思います。この関数型インタフェースを実装する場合、今までのJavaでは以下のように書く必要がありました。name;}}};System.out.println(t.getGreeting("suzy"));ラムダ式を用いると、以下のように少し簡潔に実装することがきます。name;}};System.out.println(t.getGreeting("suzy"));この例だけでは、記述量が少し減る程度で、あまりラムダ式のメリットを感じ取ることができないかもしれませんね。Javaのラムダ式では、できるだけ記述をシンプルにして、本来集中すべき「処理」そのものに注力できるようにと、色々な省略記法が用意されています。API」との組み合わせで、より本領を発揮するようになります。構文を覚える前に、関数型プログラミングの考え方そのものを学習するのも良いかと思います。デフォルトメソッドJavaはインタフェースに実装を持つことができませんでしたが、defaultキーワードを指定すると、インタフェース自体に処理を定義できるようになりました。"suzy";}}実装クラス側は、デフォルトメソッドの定義は必須ではありません。必要に応じてオーバーライドして処理を上書きすることができます。TestDefaultMethodImpl();System.out.print(obj.getName());}Optional最後にご紹介するのは、Java8で新たに追加されたクラスjava.util.Optional。APIリファレンスには以下のように記載されています。null以外の値が含まれている場合も含まれていない場合もあるコンテナ・オブジェクトです。これでは少し分かりにくいのですが、ある値をラップして、"その値はnullの可能性がある"、という事を示すためのクラスがOptionalです。以下のロジックを実行した場合、必ずNullPointerExceptionが発生します。これはgetNameメソッドがnullを返す可能性があることを、呼び出し元が意識していないことが原因のひとつと考えられます。dataMap.get(key);}ここでgetNameメソッドの戻り値の型をOptionalに変更します。Optional.ofNullable(dataMap.get(key));}こうすると、呼び出し元は「getNameメソッドの戻り値はnullの可能性があるので、nullの場合の振る舞いを決めよう」という点を意識させられます。これにより、プログラムの堅牢性が高められることが期待されます。ちなみに、サンプルで使用しているorElseは、値がnullの場合のデフォルト値を指定できるメソッドです。まとめJava8の新機能の中から「ラムダ式」「デフォルトメソッド」「Optional」をご紹介しました。皆さんにとって、普段なじみの深いものはあったでしょうか。個人的には、関数型プログラミングの理解をもう少し深めたいと考えています。次回もJava8の新機能をテーマに執筆予定です。indexともに世界をアップグレードできる、そんな日を夢見て。