LoginSignup
0
0

More than 1 year has passed since last update.

Javaのラムダ式の覚書

Last updated at Posted at 2022-10-18

Java(jdk1.8以降)のラムダ式について、簡単にまとめたものです。

1. ラムダ式の例

以下のインターフェースがあるとします。

Calculation.java
package test;

@FunctionalInterface
public interface Calculation {
    public int add(int x, int y);
}

1.1. ラムダ式を使用しない場合(匿名クラス)

ラムダ式を使用しない場合、上記のインターフェースを使用するには、以下のように匿名クラスでaddメソッドをオーバーライドして呼び出します。

NotLambdaMain.java
package test;

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

        // 匿名クラスでメソッドをオーバーライド
        Calculation obj = new Calculation() {
            @Override
            public int add(int x, int y) {
                System.out.println("テスト");
                return x + y;
            }
        };

        // Calculationのaddメソッドの呼び出し
        System.out.println(obj.add(3, 6));
    }
}
実行結果
テスト
9

1.2. ラムダ式を使用した場合

ラムダ式を使用する場合は、以下のように記述することができます。

LambdaMain.java
package test;

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

        // ラムダ式で記述
        Calculation obj = (x, y) -> {System.out.println("テスト"); return(x + y);};

        // Calculationのaddメソッドの呼び出し
        System.out.println(obj.add(3, 6));

    }
}
実行結果
テスト
9

上記でSystem.out.println("テスト");の処理が不要な場合、以下のように記述することができます。

LambdaMain2.java
package test;

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

        // ラムダ式で記述
        Calculation obj = (x, y) -> x + y;

        // Calculationのaddメソッドの呼び出し
        System.out.println(obj.add(3, 6));

    }
}
実行結果
9

2. あらかじめ用意されている関数型インターフェース

ラムダを使用する際に関数型インターフェースを用意しなくていいように、パッケージjava.util.functionに関数型インターフェースがあらかじめ用意されています。
代表的なものとして、以下の関数型インターフェースが用意されています。

関数型インターフェース 関数メソッド 説明
Supplier<T> T get() 引数は受け取らずに、型(T)の戻り値を返す。
Consumer<T> void accept(T) 型(T)の引数を受け取って、戻り値を返さない。
Function<T, R> R apply(T) 型(T)の引数を受け取って、型(R)の戻り値を返す。
Predicate<T> boolean test(T) 型(T)の引数を受け取って、boolean値を返す。

上記の関数型インターフェースをラムダ式で使用する場合のサンプルは以下となります。

Sample.java
package test;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class Sample {

    public static void main(String[] args) {

        // Supplier<T>のサンプル
        Supplier<String> obj1 = () -> "Supplier<T>のテスト";
        System.out.println(obj1.get());

        // Consumer<T>のサンプル
        Consumer<String> obj2 = a -> System.out.println(a + "のテスト");
        obj2.accept("Consumer<T>");

        // Function<T, R>のサンプル
        Function<Integer, String> obj3 = a -> "Function<T, R>のテスト: " + String.valueOf(a);
        System.out.println(obj3.apply(5));

        // Predicate<T>のサンプル
        Predicate<String> obj4 = a-> a.equals("test");
        if (obj4.test("test")) {
            System.out.println("Predicate<T>のテスト");
        }
    }
}
実行結果
Supplier<T>のテスト
Consumer<T>のテスト
Function<T, R>のテスト: 5
Predicate<T>のテスト

以上

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