関数型インタフェースとラムダ式で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);
}
}