💨

【Java】ラムダ式

に公開

ラムダ式とは?

  • ラムダ式は、1回だけ使用する処理を短く書くための手段
  • 匿名クラスの代わりとして使える
  • Stream APIなどでも利用される

まずは普通のメソッドを復習

たとえば、数を2倍にするメソッドを作る場合、従来の方法では以下のように記述すると思います。
しかし、この twice メソッドをたった1度しか使わないなら、毎回メソッドを書くのは面倒ですよね。

package lambdaTest;

public class Main {
	public static int twice(int x) {
		return x * 2;
	}

	public static void main(String[] args) {
		System.out.println(twice(5)); // 10
	}
}

匿名クラスで短縮

Javaでは、メソッドの代わりに匿名クラスや関数型インターフェース使用することもできます。たとえば、Functionを使用して上記と同じ処理を書いてみます。
この方法でも記述することは出来ますがコードが長いですね。
これをラムダ式でもっと短くしましょう!

package lambdaTest;

import java.util.function.Function;

public class MainFunction {
	public static void main(String[] args) {
		Function<Integer, Integer> twice = new Function<Integer, Integer>() {
			@Override
			public Integer apply(Integer x) {
				return x * 2;
			}
		};

		System.out.println(twice.apply(5)); // 10
	}
}

https://zenn.dev/codek2/articles/57a7b02dc5f9eb
https://zenn.dev/codek2/articles/dbbe5e9ceddc49

ラムダ式でスッキリ記述する

x -> x * 2の部分がラムダ式です。
x:引数、x * 2:処理内容

わざわざメソッドを定義しなくても、1回限りの処理をサクッと記述することが出来ますね!

package lambdaTest;

import java.util.function.Function;

public class MainLambda {
	public static void main(String[] args) {
		Function<Integer, Integer> twice = x -> x * 2;

		System.out.println(twice.apply(5)); // 10
	}
}

ラムダ式の基本構文

(引数リスト) -> { 処理の内容 }
  • 引数リスト:メソッドの引数にあたる部分で、()内に記述します。
  • 処理の内容:処理内容を記述します。

引数なし

() -> System.out.println("Hello, Lambda!");

引数あり

intなどのデータ型は不要

(x) -> x * 2;

引数が1つ

()は省略可

x -> x * 2;

引数が2つ

(x, y) -> x + y;

return

  • 処理が1行で、結果をそのまま返す場合はreturnを書かなくてもOK
Function<Integer, Integer> square = x -> x * x;
  • returnを使う場合は {}を付ける必要がある
Function<Integer, Integer> square = x -> {
    return x * x;
};
  • 処理が複数行になる場合は{}をつけ、returnを記述する
Function<Integer, Integer> square = x -> {
    System.out.println("計算中...");
    return x * x;
};

その他の例

リストの各要素を処理

package methodReferenceTest;

import java.util.Arrays;
import java.util.List;

public class MainListTest {
	public static void main(String[] args) {
		List<String> names = Arrays.asList("高橋田", "大川山", "杉原野");
		//IterableインターフェースのforEach メソッド
		names.forEach(System.out::println);
	}
}

<出力例>

https://zenn.dev/codek2/articles/7fbfa22ba62e69

Udemyで講座を公開中!
https://zenn.dev/codek2/articles/e9e44f3e0023fb

X(旧Twitter)
https://twitter.com/kunchan2_

Zenn 本
https://zenn.dev/codek2?tab=books

Youtube
https://www.youtube.com/@codek2_studio

Discussion