【Java】 関数型インタフェースについて

【Java】 関数型インタフェースについて

関数型インタフェースの定義

関数型インタフェースとは、抽象メソッドを1つだけ持つインタフェースのことです。この性質により、関数型インタフェースはラムダ式やメソッド参照とともに使用されることが多いです。

例えば、以下のようなインタフェースは関数型インタフェースと見なされます:


@FunctionalInterface
public interface MyFunction {
    void apply(String input);
}
        

このインタフェースには抽象メソッド apply が1つだけ存在するため、関数型インタフェースとして利用できます。

@FunctionalInterfaceアノテーション

@FunctionalInterface アノテーションは、インタフェースが関数型インタフェースであることを明示するために使用されます。このアノテーションを付与すると、Javaコンパイラがそのインタフェースが正しく関数型インタフェースの要件を満たしているかをチェックします。

以下の例では、正しい関数型インタフェースとエラーになるケースを示します:


@FunctionalInterface
public interface CorrectFunctionalInterface {
    void execute();
}

@FunctionalInterface
public interface InvalidFunctionalInterface {
    void method1();
    void method2(); // コンパイルエラー: 抽象メソッドが2つ以上ある
}
        

具体例

関数型インタフェースはラムダ式とともに利用されることが一般的です。以下に、いくつかの具体例を示します。

例1: Runnableインタフェース

Runnable はJavaで最も一般的な関数型インタフェースの1つです。


Runnable task = () -> System.out.println("Task is running");
new Thread(task).start();
        

例2: Comparatorインタフェース

Comparator は2つの値を比較するための関数型インタフェースです。


Comparator<String> comparator = (s1, s2) -> s1.length() - s2.length();
List<String> list = Arrays.asList("apple", "banana", "cherry");
Collections.sort(list, comparator);
System.out.println(list); // 出力: [apple, cherry, banana]
        

例3: Consumerインタフェース

Consumer は引数を受け取り、何らかの処理を行う関数型インタフェースです。


Consumer<String> printer = s -> System.out.println("Hello, " + s);
printer.accept("world"); // 出力: Hello, world
        

Stream APIとの関連性

Java 8以降、Stream API は関数型インタフェースを多用しています。Stream を使用すると、データの処理を簡潔に記述できます。

例えば、以下のコードはリストの各要素をフィルタリングして、結果を表示するものです:


List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
     .filter(name -> name.startsWith("A"))
     .forEach(System.out::println); // 出力: Alice
        

デフォルトメソッドと静的メソッド

関数型インタフェースには、デフォルトメソッド静的メソッド を含めることができます。ただし、これらは抽象メソッドには含まれないため、インタフェースが関数型インタフェースの条件を満たすかどうかには影響を与えません。


@FunctionalInterface
public interface AdvancedFunctionalInterface {
    void execute();

    default void log(String message) {
        System.out.println("Log: " + message);
    }

    static void printVersion() {
        System.out.println("Version 1.0");
    }
}
        

これにより、追加の機能をインタフェースに組み込むことが可能です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です