2016年6月30日木曜日

java8 ラムダ式(lambda式)

Java8で新しく追加された機能である「ラムダ式」とはなんでしょうか。
ラムダ式とは関数型インターフェイスのメソッドの実装の際に使われるもので、
実装を簡潔に表記することができるものです。
名前からすると大層な技術のような印象を受けますが、そんなに難しくありません。

ラムダ式は関数型インターフェイスのメソッドを実装するためのものなので、
ラムダ式を理解するためにまず関数型インターフェイスがなんなのかを理解する必要があります。
関数型インターフェイスとは以下のような抽象メソッドをひとつだけ持つインターフェイスのことです。
-----------------------------------------------------
//functional interface
interface functional_interface_dayo
{
    public String sayKonnichiwa(String name); //抽象メソッド
}
-----------------------------------------------------


以下の場合は関数型インターフェイスになりません。
-----------------------------------------------------
interface Ex{
    String toString();//Objectクラスのメソッドのオーバーライド
}
-----------------------------------------------------

-----------------------------------------------------
interface Ex2{
    default void sayHi();//defaultメソッド
}
-----------------------------------------------------

ただし上の3つ(抽象メソッド+Objectクラスのメソッドのオーバーライド、defaultメソッド)を合わせると
「全体として抽象メソッドがひとつだけあるインターフェイス」になりますので関数型インターフェイスとなります。
-----------------------------------------------------
//functional interface
interface functional_interface_dayo
{
              String toString();
              default void sayHi();
              public String sayKonnichiwa(String name); //抽象メソッド
}
-----------------------------------------------------
以上が関数型インターフェイスの説明です。


さて、関数型インターフェイスが理解できてしまえばラムダ式の理解は簡単です。
以下のコードを見てください。
-----------------------------------------------------
public class HelloWorld
{
             public static void main(String[] args)
             {

                   functional_interface_dayo f = (String name) -> {
                            return "Konnichiwa " + name;
                };
 
                            System.out.println(f.sayKonnichiwa("Tanaka"));
             }
}

//functional interface
interface functional_interface_dayo
{
              public String sayKonnichiwa(String name);
}
-----------------------------------------------------
これがラムダ式で書いた抽象メソッドの実装です。


ラムダ式で書かないで実装しようとすると以下のようになります。
-----------------------------------------------------
public class HelloWorld implements functional_interface_dayo
{
             public static void main (String[] args)
             {
                  HelloWorld h = new HelloWorld();
                  System.out.println(h.sayKonnichiwa("Tanaka"));
             }

             public String sayKonnichiwa(String name){
                     return "Konnichiwa " + name;
             }

 
}

//functional interface
interface functional_interface_dayo
{
              public String sayKonnichiwa(String name);
}
-----------------------------------------------------
大まかに言えばラムダ式とはメソッド定義を式として扱える機能のことです。

ラムダ式を特徴づけるのは以下のような矢印を使った書き方です。
(仮引数列) -> {処理};

この部分は以下のように省略ができます。
(name) -> {return "hello,"+name};//引数のデータ型を省略出来る
name -> "hello,"+name; //処理を囲むカッコも省略出来る、returnも。引数の丸括弧が省略出来るのは引数がひとつの時だけ
() -> "hello,world"; //引数がないとき。丸括弧は省略できない
name -> {return "hello,"+name;}; //処理をかっこで囲んだ場合、文にする必要がある。処理は複数行定義出来る