【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");
}
}
これにより、追加の機能をインタフェースに組み込むことが可能です。