Java

【Java】ラムダ式と関数型インターフェース

こんにちは、ともです。

お久しぶりです。応用情報技術者試験の対策でJavaSilverの勉強がストップしていましたが、また今日から頑張りたいという気持ちです。

今回は関数型インターフェースとラムダ式という部分について理解をまとめ行こうかと思います。

ラムダ式

ラムダ式とは

  1. 実装が必要なメソッドを1つだけ持つインターフェース型変数を定義できる。
  2. インターフェース型変数は代入する必要がある。

そしてラムダ式はこんな感じに記述します。

() -> {
    System.out.println("test ramda");
};

関数のように見えるような、馴染みのない形をしていますね。

簡単なサンプルを作成してみました。

//一つだけ実装する必要があるインターフェース
interface Greet {
	public void greeting();
}

public class Main {
	public static void main(String[] args) {
		//②左辺に代入先がないと怒られてしまう。
		/*
		() -> {
			System.out.println("test ramda");
		};
		*/
		
              //★ムダ式で実装が1つ必要なインターフェース型のインスタンスを作成&代入
		Greet jp = () -> {
			System.out.println("こんにちは!");
		};
		
		Greet en = () -> {
			System.out.println("Hello!");
		};
		
		Greet chi = () -> {
			System.out.println("你好!");
		};
		
		jp.greeting();
		en.greeting();
		chi.greeting();
	}
}

Greetという「挨拶」の実装を必要とするインターフェースを作成しました。このクラスは挨拶をするメソッド「greeting()」を1つ持っています。(実装が1つ必要なインターフェース)

ラムダ式では『実装が1つ必要なインターフェース型のインスタンス』を作成することができます。よってコード中の★のように代入することができます。

つまりgreeting()の実装内容を与えた上でインスタンスを作成することができるのです。

関数型インターフェースとは

関数型インターフェースとは、先ほどから記述している

『実装が必要なメソッドを1つだけ持つインターフェース』のことです。名前は難しそうに聞こえますが、実物を見れば何ら難しいことはありませんね。

// 関数型インターフェースの例
interface Greet {
	public void greeting();
}

ラムダ式を利用するメリット

Java8からラムダ式は実装されました。以前はラムダ式は使えなかった訳です。

Q. ラムダ式がない場合はどのような実装になるのでしょうか。

A. インターフェースを実現したクラスを作成する必要があり、クラスが増える。

先ほどのGreetインターフェースで記述します。

interface Greet {
	public void greeting();
}

class JapanGreet implements Greet {
	public void greeting() {
		System.out.println("こんにちは!");
	}
}

class EnglishGreet implements Greet {
	public void greeting() {
		System.out.println("Hello!");
	}
}

class ChineseGreet implements Greet {
	public void greeting() {
		System.out.println("你好!");
	}
}

public class Main {

	public static void main(String[] args) {
		Greet jp = new JapanGreet();
		Greet en = new EnglishGreet();
		Greet chi = new ChineseGreet();
		
		jp.greeting();
		en.greeting();
		chi.greeting();
	}

}

日本語(JapanGreet)・英語(EnglishGreet)・中国語(ChineseGreet)で挨拶するクラスを作成しました。

実装が1つだけのインターフェース型のクラスはラムダ式で実現可能ですから、ラムダ式があれば作成する必要のないクラスです。

ラムダ式の文法

ラムダ式では前述で紹介した記述方法よりも短く記述することができます。

式が1つの場合

前述のgreeting()のように実行したい処理が1つの場合は「{}」を削除することができます。

// 省略前
Greet jp = () -> {
    System.out.println("こんにちは!");
};

// 省略後
Greet jp = () -> System.out.println("こんにちは!");

returnの省略

処理が1つしかない場合、returnを省略することが可能。

interface Greet {
	public String greeting();
}

// 省略前
Greet jp = () -> {
    return "こんにちは!";
};

// 省略後
Greet jp = () -> "こんにちは";

下記のように、省略形ではreturnをつけることコンパイルエラーとなるので注意。

// コンパイルエラー
Greet jp = () ->  return "こんにちは";

まとめ

Javaでラムダ式を記述する方法について理解をまとめました。

  • 関数型インタフェースとは、実現する必要があるメソッドを1つだけ持つインターフェース
  • ラムダ式とは、関数型インターフェース型のインスタンスを生成することができる便利な式

このような理解です。JavaSilver取得に向けて頑張って勉強を続けていきたいと思います!