2014年3月18日(米国時間)、ラムダを筆頭に数多くの新機能が含まれるJava 8がいよいよリリースされる。

ここ数年、JavaはOracleのSun買収による混乱、当初Java 7で実装されるはずだった多くの機能の先送り、さらにはJava 8のリリースの遅延など様々な要因によって強い停滞感があり、それが関数型言語の機能を取り入れたScalaなどJavaの代替となるJVM言語の台頭にも繋がった。

そうしたJavaプログラマの溜まりに溜まったモヤモヤを払拭するアップデートとして期待されているのが今回のJava 8だ。前述の通りラムダの導入による新たな構文からStream APIやTime APIといったライブラリの追加まで、非常に多くの新機能を含んでいる。

本稿ではそのJava 8の主要な新機能についてサンプルコードを交えて紹介していく。Java 8の新機能を押さえるための参考になれば幸いだ。

Java 8の目玉、ラムダ式

Java 8で追加された機能のうち最もインパクトが大きいのはなんといってもラムダ式の導入だろう。ラムダ式を使用することでこれまで匿名クラスとして実装していたような処理を簡単に記述できるようになる。また、後述するコレクションAPIでもラムダ式を活用した新たなAPIが追加されているなど、ラムダはJava 8において非常に大きな役割を果たしている。

ラムダ式の基本

まずは簡単な例を見てみよう。たとえばこれまでComparatorを使用したコレクションのソート処理は以下のように記述する必要があった。

List<String> list = Arrays.asList("Java", "Scala", "Groovy");
list.sort(new Comparator<String>(){
  @Override
  public int compare(String s1, String s2){
    return s1.length() - s2.length();
  }
});

Java 8ではこの処理をラムダ式を使用して以下のように記述することができる。このような単純な例でも明らかに記述量が減っていることがわかるだろう。

List<String> list = Arrays.asList("Java", "Scala", "Groovy");
list.sort((String s1, String s2) -> s1.length() - s2.length());

ラムダ式の構文は以下の通りだ。式を1行で記述する場合はreturn文は必要ないが、{...}で複数行の処理を記述する場合はreturn文で戻り値を返す必要がある点に注意してほしい。

// 関数の処理を1行で記述する場合
(引数のリスト) -> 式

// 関数の処理を複数行で記述する場合
(引数のリスト) -> {
  関数の処理
  return 値;
}

また、ラムダ式の引数の型が自明な場合は引数の型を省略することができる。たとえば前述のソートのサンプルは以下のように記述することができる。

List<String> list = Arrays.asList("Java", "Scala", "Groovy");
list.sort((s1, s2) -> s1.length() - s2.length());

さらにラムダ式の引数が1つの場合は引数リストの括弧も省略可能だ。

list.forEach(s -> System.out.println(s));