😺

JavaSilver強化④関数型インターフェースとラムダ式

に公開

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

関数型インターフェースとは、1つの抽象メソッドだけを持つインターフェースのことです。
Java 8から導入され、ラムダ式で簡単に実装することができます。

関数型インターフェースの特徴:

  • 抽象メソッドが1つだけである。
  • @FunctionalInterface アノテーションがあると、コンパイラが関数型インターフェースであることをチェックします。

例:Runnableインターフェース

@FunctionalInterface
public interface Runnable {
    void run();
}

ラムダ式とは?

ラムダ式は、匿名クラスの簡略化された記述方法です。
ラムダ式を使用すると、関数型インターフェースを簡潔に実装することができます。

基本的な構文:

(引数) -> { 処理 }

例:Runnableをラムダ式で表現

Runnable task = () -> System.out.println("実行中!");
task.run();  // 実行中!

代表的な関数型インターフェースとラムダ式

関数型インターフェースは1つの抽象メソッドを持つ。
そして、その抽象メソッドの定義をラムダ式で行われる感じです。

Javaには標準的な関数型インターフェースがいくつか用意されています。
以下はその代表例です。

1. Consumer<T> — 引数を受け取って処理を行う

  • メソッド: void accept(T t)
  • 使用例: 値を受け取って処理する(例: 出力)
Consumer<String> printer = s -> System.out.println("出力: " + s);
printer.accept("こんにちは");  // 出力: こんにちは

2. Supplier<T> — 値を返す

  • メソッド: T get()
  • 使用例: 値を生成して返す(例: データ提供)
Supplier<String> supplier = () -> "Java Silver 勉強中";
System.out.println(supplier.get());  // Java Silver 勉強中

3. Function<T, R> — 引数を受け取り、結果を返す

  • メソッド: R apply(T t)
  • 使用例: 値を変換する(例: 文字列の長さ)
Function<String, Integer> lengthFunc = s -> s.length();
System.out.println(lengthFunc.apply("Hello"));  // 5

4. Predicate<T> — 条件判定を行う

  • メソッド: boolean test(T t)
  • 使用例: 条件判定(例: 数字が偶数かどうか)
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println(isEven.test(4));  // true
System.out.println(isEven.test(5));  // false

5. Runnable — 実行する(引数なし)

  • メソッド: void run()
  • 使用例: 処理の実行
Runnable task = () -> System.out.println("処理実行中...");
task.run();  // 処理実行中...

関数型インターフェースを作る方法

自分で関数型インターフェースを作成することもできます。
以下は、文字列の長さを取得する関数型インターフェースの例です。

自作関数型インターフェースの例:

@FunctionalInterface
public interface StringLengthFunction {
    int getLength(String s);
}

使用例:

public class Main {
    public static void main(String[] args) {
        StringLengthFunction lengthFunc = s -> s.length();
        System.out.println(lengthFunc.getLength("Java"));  // 4
    }
}

まとめ

Javaの関数型インターフェースとラムダ式は、コードを簡潔にする強力なツールです。
特に、標準的な関数型インターフェースはよく使われるので、試験や実務でよく出題されます。
ラムダ式とともに使うことで、コードの可読性と保守性が向上します。

  • 関数型インターフェース: 抽象メソッドが1つのインターフェース
  • ラムダ式: 関数型インターフェースを簡潔に実装するための記法
  • 代表的なインターフェース: Runnable, Consumer, Supplier, Function, Predicate

インターフェース メソッド名 引数の型 戻り値の型 主な用途
Runnable void run() なし なし 引数も戻り値もない処理を実行 () -> System.out.println("実行")
Consumer<T> void accept(T t) T なし 値を受け取って処理 s -> System.out.println(s)
Supplier<T> T get() なし T 値を生成して提供 () -> "Hello"
Function<T, R> R apply(T t) T R 値を変換(T→R) s -> s.length()
Predicate<T> boolean test(T t) T boolean 条件に一致するかどうかを判定 s -> s.isEmpty()

Discussion