Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

ラムダ式を利用する

(type args, …) -> { statements }
type:引数の型
args:引数の名前
statements:処理本体

ラムダ式はJavaSE 8から導入された構文で、大雑把にいうならば、メソッドをシンプルに表すための構文です。
例えば、「無名クラスを定義する」項の無名クラスをラムダ式で書き換えた例です。

AnonymousSample.java

package com.example.mynavi.object;

public class AnonymousSample {
  public static void main(String[] args) {
    IPrintable p = () -> {
      System.out.println("TEST");
    };
    p.print();  // 結果:TEST
  }
}

ラムダ式で実装できるのは、関数型インターフェイスのメソッドです。この例であれば、IPrintableインターフェイスのprintメソッドをラムダ式で実装しているわけです。

note

関数型インターフェイス
関数型インターフェイスとは、メソッドを一つしかもたないインターフェイスのことです。@FunctionalInterfaceアノテーションを利用して、明示的に宣言することもできます。

@FunctionalInterface
public interface IPrintable {
  void print();
}

@FunctionalInterfaceアノテーションを付与した場合、インターフェイスがメソッドを複数持つなど、関数型インターフェイスの要件を満たさない場合に、コンパイルエラーを返すことができます。

ラムダ式のさまざまな記法

ラムダ式は特定の条件を満たす場合に、さまざまな省略記法を用いることができます。たとえば、以下のようなラムダ式があったとします。

SampleInterface hoge = (String str) -> {
  return str + str;
};

これは、まず以下のように書き換えることができます。

SampleInterface hoge = (str) -> {
  return str + str;
};

ラムダ式では引数の型をインターフェイスの定義から推論しますので、省略できます。これを型推論と言います。
そして、引数がひとつの場合には、引数を括るカッコも省略できます(引数が複数、またはゼロの場合には省略できません)。

SampleInterface hoge = str -> {
  return str + str;
};

最後に、処理本文がreturnの1文だけの場合は、{…}とreturnを省略できます。

SampleInterface hoge = str -> str + str;

いかがですか。最初のラムダ式に比べると、ぐんとコードがシンプルになったことが確認できるでしょう。このように、ラムダ式では条件次第でさまざまな記法があるので、理屈も理解しながら、それぞれの記法に慣れていきましょう。

継承、インターフェイス
extendsキーワード
interface命令
implementsキーワード
無名クラスを定義する
ラムダ式を利用する

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職