java8について 2014/03/07
java8の新機能 新しく導入される機能については、 以下のページに一覧が載っています。 http://openjdk.java.net/projects/jdk8/features 上記リンクの中で、以下の新機能について解説します。 • 126 Lambda Expressions & Virtual Extension Methods
java8からラムダ式が サポートされる ラムダ式とは? → 簡単に言うと匿名関数 (厳密には異なるらしい) 以下のような書き方になる。 (仮引数) (関数本体) (int x, int y) -> {return x + y;} → ラムダ式を使わなかった場合 public int calc(int x, int y) { return x + y; } → 関数はcalcという名前で定義される。
関数型インターフェース •実装すべきメソッドがひとつだけであるインターフェースを 関数型インターフェースという。 •関数型インターフェースにはラムダ式が適用できる。 // Runnableインターフェースはrunメソッドのみ定義 Runnable r = () -> { System.out.println("test"); }; Thread t = new Thread(r); •関数型インタフェースを明示的に表す場合、 @FunctionalInterfaceが使用できる → 関数型インターフェースの定義に従っていない場合、 コンパイル時にエラーが出る。(書き間違いの抑止効果)
型推論 (int x, int y) -> {return x + y;} ↓ 引数の型は推論できる場合、省略できる (x, y) -> {return x + y;} ↓ 引数が一つで型が推論できる場合は()も不要 x -> { /* 関数本体 */ } ↓ 関数本体がreturn文のみだった場合、rerurn, { ;}も省略できる x -> x + 5
メソッド参照 •「::」演算子を使用して、メソッドを関数オブジェクトとして 参照できる String::valueOf これは x -> String.valueOf(x) と一緒。
interfaceに仕様が増えた① •interfaceに実装を持てるようになった。 interface Test { // 実装するメソッドにキーワード「default」を付ける default void test(String s){ System.out.println(s); } •defalutメソッドはオーバーライドできる。
interfaceに仕様が増えた② •interfaceに実装を持てるようになったので、 多重継承が可能になった。 public class TestImpl implements Test1, Test2 { // Test1, Test2共に「test」というdefaultメソッドが // 定義されていた場合、コンパイルエラーとなる }
interfaceに仕様が増えた③ •defaultメソッドをオーバーライドすればコンパイル可能。 public class TestImpl implements Test1, Test2 { @Override public void test(String s) { System.out.println(s); } •どちらかのdefaultメソッドを呼び出すことも可能 Test2.super.test(s);
参考 •きしだのはてな http://d.hatena.ne.jp/nowokay/20130610 •徹底解説!Project Lambdaのすべて [JJUG CCC 2013 Fall H-2] from bitter_fox http://www.slideshare.net/bitter_fox/jjug-ccc-2013-faul