関数型インタフェースとラムダ式でJavaをもっと書きやすく!

アイキャッチ画像

Java 8から導入されたラムダ式は、コードを短く・わかりやすくできる強力なツールです。

その裏側で重要となるのが関数型インタフェースという概念です。

ここでは、関数型インタフェースの意味、ラムダ式で使う理由、そしてラムダ式の基本文法をわかりやすく解説します。

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

関数型インタフェースとは、抽象メソッドを1つだけ持つインタフェースのことです。例えば、次のインタフェースが関数型インタフェースとなります。

@FunctionalInterface

public interface MyAction {

    void execute();

}

MyAction は、execute()という1つだけのメソッドを持つため、関数型インタフェースとなります。

なぜラムダ式で使うのか

ラムダ式は、「1つだけメソッドを持つ」という単純さを活用して、次のことを可能にします。

・オブジェクトを生成せず、処理だけを直接記述できる

・可読性・メンテ性が向上

・関数そのものを引数として渡せる

例えば、次の匿名クラス

MyAction action = new MyAction() {

    @Override

    public void execute() {

        System.out.println("処理を実行しました");

    }

};

ラムダ式なら

MyAction action = () -> System.out.println("処理を実行しました");

となり、コードが大幅に簡潔になります。

ラムダ式の基本

ラムダ式は、次の文法で表されます。

(引数) -> {処理}

引数がない例

Runnable r = () -> System.out.println("Hello, Lambda!");

引数が1つの例

Consumer<String> consumer = name -> System.out.println("Hello, " + name);

Javaには様々な関数型インタフェースがあるのでいくつか紹介します。

名前と役割

Supplier 値を後から取得したいとき

Consumer 値を受け取って処理したいとき

Function 入力値から出力値を変換したいとき

1.Supplierの具体例

Supplier は、「値を取得したいタイミング」で処理を実行できるインタフェースです。この例では値の取得だけを後から行え、遅延取得できたり、get()を呼ぶたび、異なる値(UUID)が取得できます。

import java.util.UUID;

import java.util.function.Supplier;

public class UuidSupplierExample {

    public static void main(String[] args) {

        // UUIDを生成するSupplier

        Supplier<String> uuidSupplier = () -> UUID.randomUUID().toString();

        // 呼び出すたびに異なるUUIDが取得できる

        System.out.println("UUID 1: " + uuidSupplier.get());

        System.out.println("UUID 2: " + uuidSupplier.get());

    }

}

2.Consumerの具体例

Consumer は、値を受け取って何らかの処理だけ行うインタフェースです。

この例ではaccept()メソッドで名前を受け取ってメッセージ出力を行ってます。

import java.util.function.Consumer;

public class ConsumerExample {

    public static void main(String[] args) {

        // 名前を受け取ってメッセージを出力

        Consumer<String> printer = name -> System.out.println("Hello, " + name + "!");

        printer.accept("Java");

    }

}

3.Functionの具体例

Functionインタフェースは、入力値を受け取り、それを別の型や値に変換して返す処理を行うインタフェースです。

この例ではString型を受けとり、Integer型に変換しています。

import java.util.function.Function;

public class FunctionExample {

    public static void main(String[] args) {

        // String → Integer に変換するFunction

        Function<String, Integer> stringToInteger = s -> Integer.parseInt(s);

        String input = "12345";

        Integer output = stringToInteger.apply(input);

        System.out.println("入力文字列: " + input);

        System.out.println("変換後の整数: " + output);

    }

}