Open4

Javaのラムダ式関連のサンプルなど

りむふぁくしりむふぁくし

Playground実行で動作確認なのでJavaバージョン不明だが少なくとも8以降

関数インターフェースをあるメソッドに渡す例
加算と減算のインスタンスを作っておいて、それをprintResultに渡している。
加算/減算を行うCalculatorインスタンスをそれぞれ定義しており、こちらが実質的に渡す関数となる。

Javaには変数に格納した関数という存在はなく、抽象メソッドが一つのインターフェースを実装したオブジェクトを関数とみなすことで対応したように思う。(実はメソッド渡しもラムダ式と同時に導入されたが割愛)

public class Program
{
    public static void main(String[] args) {

        // 加算を行うインスタンス
        Calculator adder = (x, y) -> x + y;

        // 減算を行うインスタンス
        Calculator subtractor = (x, y) -> x - y;

        printResult(10, 5, adder); // 15
        printResult(10, 5, subtractor); // 5
		
  }

    // メソッドの引数で関数を受け取る
    public static void printResult(int x, int y, Calculator calculator) {
        // 関数を呼び出して結果を表示する
        int result = calculator.calculate(x, y);
        System.out.println(result);
    }
}


@FunctionalInterface
public interface Calculator {
    // 二つの整数を受け取って計算する抽象メソッド
    int calculate(int x, int y);
}

ちなみにラムダ式の導入背景を考察すると、Java8で導入されたStreamAPIの一部にfilterやmapなどの関数を引数とするメソッドが追加されたことで、関数を即席で定義しやすくする必要性が生じたという背景があるためと思われる。
匿名クラスでは書き方が冗長となることを嫌気したのだろう。

りむふぁくしりむふぁくし

インスタンスを作ると言っているのにnewキーワードが見当たらない
プリントリザルトに渡しているのは何行目か
Javaには関数という存在がない??とは?
そこの下の記述も難解
関数インターフェースのアノテーションが急に出てきたけど何?

りむふぁくしりむふぁくし

インスタンスを作ると言っているのにnewキーワードが見当たらない

ラムダ式の場合、newキーワードなしでインスタンスを作ることができる仕様になっている。

Javaには関数という存在がない??とは?

関数を変数に格納する仕組みを関数型インターフェースのオブジェクトを変数に格納する形で実現している。

関数インターフェースのアノテーションが急に出てきたけど何?

@FunctionalInterfaceの説明を入れる

上記の内容を盛り込んで記事を書く