【Java】ラムダ式とは何なのか?

Java

ラムダ式という機能をご存じでしょうか?

ギリシャ数字?数学の式の一つ?とJava初心者の方は頭に?がたくさん浮かぶことでしょう。

私も初めて見た時はげんなりしたものです。

しかしこのラムダ式を知っておくことでコードを簡潔に書くことが可能になります。

始めは少し理解しずらい部分もあるかもしれませんが、一度理解してしまえばとても有能な機能であると理解していただけるはずです。

ではラムダ式について解説していきたいと思います。

ラムダ式とは?

そもそもラムダ式とは具体的にどういったものかというと、匿名クラスをより簡単に記述することができる機能です。

そもそも匿名クラスってなんだ?という方もいるかと思いますので、また他の機会にもう少し詳しく解説しますが、一旦簡単に説明するとメソッド内で定義することが可能なクラスの事です。

名前からもわかる通り、クラス名はついていません。

そんな匿名クラスを簡単に書くことができるのがラムダ式です。

実際のコードを使って説明していきたいと思います。

まずラムダ式なしの場合の匿名クラスの記載方法は下記のようになります。

【ラムダ式なしのコード】
public interface Anonymous {
	public String charconcat(String greeting,String name);
}

public class TimeGreet {
	public static void main(String[] args) {
		Anonymous ano = new Anonymous() {
			@Override
			public String charconcat(String greeting,String name) {
				return greeting + name + "さん。";
			}
		};		
		System.out.println(ano.charconcat("おはようございます、", "斎藤"));
		System.out.println(ano.charconcat("こんにちは、", "斎藤"));
		System.out.println(ano.charconcat("こんばんは、", "斎藤"));
	}
}
【実行結果】
おはようございます、斎藤さん。
こんにちは、斎藤さん。
こんばんは、斎藤さん。

Anonymousインタフェースにはcharconcatという抽象メソッドが定義されています。

抽象メソッドは下記記事で詳しく解説していますので、分からないという方は一度読んでみてください。

【Java】abstractとは? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

そしてTimeGreetクラスで匿名クラスとして記載し、charconcatメソッドをオーバーライドしています。

因みにオーバーライドについて分からないという方向けに下記記事もありますので、分からない方は読んでみてください。

【Java】オーバーライドについて解説 | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

ではこのコードをラムダ式を使用して書くとどうなるかと言いますと、下記のようなコードとなります。

【ラムダ式を使用してのコード】
public interface Anonymous {
	public String charconcat(String greeting,String name);
}
public class TimeGreet {
	public static void main(String[] args) {
		Anonymous ano = (greeting,name) -> {
			return greeting + name + "さん。";
		};

		System.out.println(ano.charconcat("おはようございます、", "斎藤"));
		System.out.println(ano.charconcat("こんにちは、", "斎藤"));
		System.out.println(ano.charconcat("こんばんは、", "斎藤"));
	}
}

かなり簡潔になったと思いませんか?

抽象メソッドの大部分が消えたことで、見やすくもなっていますしコーディングの際もかなり楽に書くことができるかと思います。

因みにラムダ式を使用する際はアロー演算子と呼ばれる「->」のような記号を使用します。

またこのラムダ式は関数型インタフェースでも活躍しています。

以前記載した下記の関数型インタフェースの記事を見ていただいたら分かるかと思いますが、ラムダ式を結構使用しています。

【Java】関数型インタフェースのSupplierとは? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

【Java】関数型インタフェースのConsumerとは? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

【Java】関数型インタフェースのPredicateとは? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

【Java】関数型インタフェースのFunctionとは? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

【Java】関数型インターフェースのUnaryOperatorとは? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

このようにラムダ式は覚えておいて損のない機能であることが分かっていただけたかと思います。

メソッド参照でさらに簡略化

ここまでラムダ式について解説してきましたが、メソッド参照という機能を使った方がさらに簡素に記述することができる場合があります。

例えば下記のようなラムダ式で記述したコードがあったとします。

【ラムダ式を使用したコード】
import java.util.List;
public class MethodReferences {
	public static void main(String[] args) {
		List<String> greet = List.of("山田さん、お疲れ様です。","斎藤さん、お疲れ様です。","向井さん、お疲れ様です。","鈴木さん、お疲れ様です。");
		greet.forEach(name -> System.out.println(name));
	}
}
【実行結果】
山田さん、お疲れ様です。
斎藤さん、お疲れ様です。
向井さん、お疲れ様です。
鈴木さん、お疲れ様です。

このコードはリストに入ってある文字列を一つずつ取り出して挨拶を実施してくれるコードとなっています。

因みにここで使用しているforEachについては下記記事で解説しています。

【Java】for文の使用方法を徹底解説 | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

このコードをメソッド参照を使用して記載すると下記のようになります。

【メソッド参照を使用したコード】
import java.util.List;
public class MethodReferences {
	public static void main(String[] args) {
		List<String> greet = List.of("山田さん、お疲れ様です。","斎藤さん、お疲れ様です。","向井さん、お疲れ様です。","鈴木さん、お疲れ様です。");
		greet.forEach(System.out::println);
	}
}

文字列出力の箇所がかなり簡略化されたことが分かるかと思います。

ラムダ式になった時ほどの簡略化ではありませんが、よりコード量が減ることは分かっていただけたかと思います。

まとめ

この記事ではJavaのラムダ式について解説してきました。

  • ラムダ式とは?
  • メソッド参照でさらに簡略化

ラムダ式やメソッド参照は最初何を書いているのかさっぱり分かりませんし、結構違和感があるかと思います。

私も最初はそんな感じでしたが、使っているうちに慣れてきてこちらの方が見やすくなってきました。

とりあえず使い続けていたら段々と慣れていきますので、ぜひ積極的な活用をしていってください。

以上で今回の記事は終了となります。

コメント

タイトルとURLをコピーしました