Javaコラム Javaエンジニアのためのお役立ちコラム

Java

Javaのラムダ式の読み解き方とは?方法をご紹介!

2020年10月19日
SE
Javaのラムダ式の読み解き方ってどのような方法なのですか?
PM
Java8以前のバージョンまでの記法を省略できる構築方法のことです。

Javaのラムダ式とは

Javaのラムダ式とはJava8からの構文です。例をあげると () -> System.out.println(“”Howdy, world!””) といった構文がラムダ式です。初めて目にする方、慣れていない方もいるかと思います。そんな方を対象にJavaラムダ式の読み解き方、覚え方を解説していきます。

ラムダ式とは何か

ラムダ式とは何かと聞かれれば、関数型インターフェースの実装をJava8より前のバージョンまでの記法より省略できる構文、と答えることができます。実際のコードをOracleの公式ページから引用すると以下の例があります。

ラムダ式では随分とシンプルになりました。この2つのプログラムが同一であるとは、どのように読み解けばよいのでしょう。

読み解き方

ラムダ式を読み解くにはローカルクラス、無名クラス、そして関数型インターフェースについて知る必要があります。ローカルクラスと無名クラスはJava8より前のバージョンからあるJavaの機能ですが、簡単におさらいしていきましょう。

ローカルクラス

ローカルクラスとはメソッド内に定義したクラスのことです。メソッド内でのみ有効となります。

無名クラス

無名クラスとはその名の通り名前のないクラスです。匿名クラスともいいます。主にインターフェースの実装時に名前付けしたクラスとして抽出するまでもない場合に利用されます。

ラムダ式

改めてラムダ式について見ていきましょう。ラムダ式とは関数型インターフェースの実装を省略して記載できる式のことでした。一旦関数型インターフェースについては置いておき、ラムダ式がどこを省略しているか見ていきます。

まずnew Runnable() {}の記載がなくなっています。そしてpublic void run() {}も見当たりません。このように型の省略、実装するメソッド定義の省略を行えるのがラムダ式の特徴です。

ではどのようにして省略された情報をコンパイラが知るのでしょうか。

型の省略

型を省略した場合、代入される変数の型から推論する仕組みになっています。先程の例ではRunnable rのRunnableから推論されています。この機能を型推論といいコンパイラが自動で判別しています。

メソッド定義の省略

型推論からどの型のインターフェースであるかは推論されました。しかしそのインターフェース内のどのメソッドをオーバーライドしているかは推論できません。

そのため、ラムダ式が使えるインターフェースには抽象メソッドが1つだけ、という制約があります。Runnableのインターフェース定義をみると以下のようになります。

* The general contract of the method {@code run} is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }

関数型インターフェース

ここで関数型インターフェース、という定義を見ていきましょう。関数型インターフェースとは抽象メソッドが1つだけのインターフェースのことです。

つまり、ラムダ式が使用できるインターフェースともいえます。インターフェースの定義時に明示的に関数型インターフェースである、と示すには前述のように@FunctionalInterfaceというアノテーションをクラスにつけます。

次項ではJava8から新たに提供されている、関数型インターフェース4つを紹介します。

Function

Function<T, R>のインターフェース定義です。メソッドは R apply(T) を持ちます。<T,R>は実装者が定義できる型です。実装するメソッドは引数としてTを受け取り、Rを返します。ここでは単純にString型の引数のレングスを返すFunctionを見ていきましょう。

Consumer

Consumer<T>のインターフェース定義です。メソッドはvoid accept(T)を持ちます。<T>は実装者が定義できる型です。実装するメソッドは引数としてTを受け取りますが、結果は返しません。

ここでは単純にString型の引数を、標準出力して終えるConsumerを見ていきましょう。

Predicate

Predicate<T>のインターフェース定義です。メソッドは boolean test(T t) を持ちます。<T>は実装者が定義できる型です。実装するメソッドは引数としてTを受け取り、boolean値を返します。

ここでは単純にInteger型の引数を受け、3より大きい場合にtrueを、それ以外のときにfalseを返すPredicateを見ていきましょう。

Supplier

Supplier<T&gtのインターフェース定義です。メソッドは T get() を持ちます。<T>は実装者が定義できる型です。実装するメソッドは、引数としては何も受け取りませんが、Tを返します。ここでは単純にInteger型の値を返すSupplierを見ていきましょう。

SE
ラムダ式には、さまざまな手法があるのですね。
PM
これらを取り入れることで、Javaの機能を使いこなすことが出来るでしょう。

Javaのラムダ式を理解しよう

この記事ではJavaにおけるラムダ式の読み解き方をご紹介しましたが、いかがでしたでしょうか。ラムダ式とは関数型インターフェースの実装を、Java8より前のバージョンまでの記法より省略できる構文として見てきました。

ローカルクラス・無名クラスを復習し、関数型インターフェースを知り、ラムダ式の理解ができたのではないでしょうか。Javaの機能は数多くあります。1つずつ知識を広げて自由にコーディングできるようになっていきましょう。


Java分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)