6
5

More than 1 year has passed since last update.

今さらJavaラムダ式

Last updated at Posted at 2022-12-22

1. ラムダ式とは

  • JavaSE8から導入された構文
  • 関数型インターフェースを簡潔に記載することができる
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));

// こういうやつ
list.forEach(i -> System.out.println(i));

// 結果
// A
// B
// C

2. 無名クラス(匿名クラス)と関数型インターフェース

無名クラス(匿名クラス)とは

  • 名前がないクラスのこと
  • 一度きりしか使わないといった場合に使用する
  • コードの記載が綺麗になる

無名クラスを使用する場合、new class名()の後に{}を記載します
※関数型インターフェースのConsumerを使用していますが後で説明あります

無名クラスを使用しない場合

class CustomConsumer implements Consumer<String> {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
}

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
CustomConsumer consumer = new CustomConsumer();
list.forEach(consumer);

// 結果
// A
// B
// C

無名クラスを使用した場合

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Consumer consumer = new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
};
list.forEach(consumer);

// 結果
// A
// B
// C

関数型インターフェースとは

抽象メソッドを一つのみ持つインターフェースのこと
※抽象メソッド:メソッド名のみ定義されているメソッドのこと

// 例
interface Runnable {
    // 抽象メソッドは一つのみ
    void run();
}

JavaAPIには関数型インターフェースがいくつか用意されています
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

代表的な関数型インターフェース

  • Runnable: 実行可能
    引数はなく、結果を返さない
    run()を関数メソッドに持つ

  • Consumer: 消費者
    引数があり、結果を返さない
    accept(Object)を関数メソッドに持つ

  • Supplier: 供給者
    引数がなく、結果を返す
    T get()を関数メソッドに持つ

  • Predicate: 断言する
    引数があり、結果をbooleanで返す
    boolean test​(T t)を関数メソッドに持つ

3. ラムダ式

  • 関数型インターフェースを簡潔に記載することができる

無名関数を使用する場合、しない場合、ラムダを使用する場合までの変化を以下サンプルで記載

1. 無名クラスを使用しない場合

class MyRunnable implements Runnable {
	@Override
	public void run() {
		System.out.println("Runnable is run!");
	}
}

MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();

2. 無名クラスを使用する場合(そのまま引数に設定)

new Thread(new Runnable() {
	@Override
	public void run() {
		System.out.println("Runnable is run!");
	}
}).start();

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

// クラス名の記載は不要
// 引数があれば()に記載する
new Thread(() -> {
	System.out.println("Runnable is run!");
}).start();

// 引数がないので()も不要
new Thread(System.out.println("Runnable is run!")).start();

// 備考
// 引数が一意かつ処理内容のメソッドが一つのみのためクラス名::メソッド名のような書き方が可能
new Thread((string) -> System.out.println(string)).start();

new Thread(System.out::println).start();
6
5
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
6
5