前提知識のインターフェース
ラムダ式の話の前にインターフェースの話です。分かる人は飛ばして下さい。
インターフェースとは「クラス内に含まれるメソッドの具体的な処理は記述せずに変数とメソッドの型を定義したもの」になります。
例えば、Phoneというインターフェースを利用してCallクラスやMaileクラスを作成していきます。
--インターフェースPhone
interface Phone{
String call = "電話をかけます";
String mail = "メールを送ります";
}
--インターフェースを利用してCallクラスを実装
class Call implements Phone{
public tell_call(){
System.out.println(call); --インターフェースで定義した変数callの呼び出し
}
}
--インターフェースを利用してMailクラスを実装
class Mail implements Phone{
public void send_mail(){
System.out.println(mail); --インターフェースで定義した変数mailの呼び出し
}
public static void main(String args[]){
Call c = new Call();
Mail m = new Mail();
c.tell_call; --「電話をかけます」が出力
m.send_mail; --「メールを送ります」が出力
}
}
簡単にインターフェースを表すと下記のイメージで問題ないです。
- インターフェースを土台として捉える
- その土台で定義されている空の変数やメソッドなどの道具を取り出し、
- その道具を使える状態(実装)にしていく
ただ、ここで問題になってくるのが抽象クラス(abstract)と似ている問題です。
ここでは詳しく解説しないのですが、抽象クラスは多重継承ができないので一つのクラスしか継承できないので限定的な処理をしたい時に使用します。
反対にインターフェースは多重継承が許されているので色々なインターフェースを継承することができます。
イメージ的にはiPhoneインターフェースとAndroidインターフェースを利用して新しい携帯を作るみたいな感じです。(分かりづらかったらゴメンさなさい)
ラムダ式とは
ラムダ式の目的
ラムダ式の目的は記述を簡略化する事です。構文としては以下の通りです。
引数を渡して処理内容を記述するだけで、普段メソッドを使用する時と何ら変わりません。
(引数) -> {処理内容}
メソッドを変数として扱う
ラムダ式の良いところの1つ目はメソッドを変数のように扱える点です。
使い方としては、インスタンス化する時にメソッドをそのまま記述します。たったこれだけでメソッドを使用することができます。
interface Phone{
public String Call(String name);
}
public class Main{
public static void main(String[] args){
Phone p = (name) -> { return name + "へ電話をかけます"; };
System.out.println(h.method("ビートルズ")); --ビートルズへ電話をかけます
}
}
関数型インターフェースを楽に記述
Javaには関数型インターフェースと呼ばれる抽象メソッドを一つだけ持つインターフェースが存在します。
(抽象メソッド→具体的な処理が記述されていないメソッド。定義されているのは型やアクセス修飾子。)
抽象メソッドは先程のメソッドを変数のように扱うでも使用したのが自分が作成した関数型インターフェースや、ConsumerやFunctionといったJavaが用意している関数型インターフェースが存在します。
Javaが用意している関数型インターフェースは説明が長くなってしまうので下記のサイトを見て下さい。めっちゃ分かりやすいです。
https://www.yoheim.net/blog.php?q=20160410