LoginSignup
0
0

関数型インタフェース

Last updated at Posted at 2023-05-30

関数型インタフェース

関数型インタフェースは、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);
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0