www.forefrontier.co.jp

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メソッドを呼び出すことも可能
public class TestImpl implements Test1, Test2 {
@Override
public void test(String s) {
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