関数型インタフェース
関数型インタフェースは、Javaの機能の一つであり、1つの抽象メソッドを持つ特殊なインタフェース。
ラムダ式やメソッド参照などの機能と組み合わせて、より簡潔かつ柔軟なコードを記述するための基盤となっている。
defaultメソッドやObjectクラスのメソッドのオーバーライドは抽象メソッドとしては扱われないので、以下は関数型インタフェースである。
.java
@FunctionalInterface //開発者に関数型インタフェースと伝えるもの 動作に影響はない
interface Animal {
void cry(); //抽象メソッド
default void eat(省略); //defaultメソッド
boolean equals(Object object); //Objectクラスのメソッド
}
関数の代入
関数型インタフェースを使用することで、ラムダ式の関数を変数に代入することができる。関数型インタフェースは、特定の型の関数を表現できる。以下は代表的な関数型インタフェースとその用途、実装するメソッド。
型名 | 用途 | 実装するメソッド |
---|---|---|
Function | 入力値を処理して別の型を出力する | apply |
Operator | 入力値を処理して同じ型を出力する | apply |
Consumer | 入力値を処理して出力しない(戻り値無し) | accept |
Supplier | 入力値無しで出力する | get |
使い方
関数型インタフェースを使うことで、ラムダ式でコードを簡潔にすることができている。
Function
引数で受け取った文字列の長さを出力するラムダ式を格納。
それをapplyで実行している。
public class Main {
public static void main(String[] args) {
Function<String, Integer> func = s -> s.length();
int len = func.apply("ratuki");
System.out.println(len); //6
}
}
比較
関数型インタフェースを使わない場合
public class Main {
public static void main(String[] args) {
String input = "ratuki";
int len = calculateLength(input);
System.out.println(len); // 6
}
public static int calculateLength(String s) {
return s.length();
}
}
Consumer
引数の値をprintlnで表示するラムダ式を格納。
それをaccdptで実行している。
Consumer<String> printString = str -> System.out.println(str);
printString.accept("Hello, World!");
比較
関数型インタフェースを使わない場合
public class Main {
public static void main(String[] args) {
MyConsumer printString = new MyConsumer();
printString.accept("Hello, World!");
}
}
class MyConsumer {
public void accept(String str) {
System.out.println(str);
}
}
Supplier
引数無しで0〜99の数値をランダムで返すラムダ式を格納。
それをgetメソッドで実行している。
Supplier<Integer> randomNumberSupplier = () -> {
Random random = new Random();
return random.nextInt(100);
};
int randomNumber = randomNumberSupplier.get();
System.out.println(randomNumber);
比較
関数型インタフェースを使わない場合
.java
public class Main {
public static void main(String[] args) {
MySupplier randomNumberSupplier = new MySupplier();
int randomNumber = randomNumberSupplier.get();
System.out.println(randomNumber);
}
}
class MySupplier {
public int get() {
Random random = new Random();
return random.nextInt(100);
}
}