【Java】ラムダ式について
ラムダ式とは
ラムダ式は、Java 8で導入された機能で、関数型プログラミングをサポートするためのものです。 簡潔に記述できる無名関数の一種で、コードの可読性や生産性を向上させます。 例えば、従来の匿名クラスを使ったコードを大幅に簡略化することができます。
ラムダ式の基本構文
ラムダ式は以下の形式で記述されます:
(引数) -> { 処理 }
基本構文の例をいくつか挙げます:
- 引数が1つの場合:
x -> x * x
- 引数が複数の場合:
(x, y) -> x + y
- 処理が1行の場合:
(x, y) -> x * y
({}
を省略可能) - 引数がない場合:
() -> System.out.println("Hello")
このように、ラムダ式は簡潔に無名関数を記述する手段として非常に便利です。
関数型インターフェースとラムダ式
ラムダ式を使用するには、Javaの「関数型インターフェース」を活用します。関数型インターフェースは、 抽象メソッドを1つだけ持つインターフェースで、「@FunctionalInterface」アノテーションで明示します。
@FunctionalInterface
interface MyFunction {
int apply(int x, int y);
}
これを使ってラムダ式を以下のように記述できます:
MyFunction add = (x, y) -> x + y;
System.out.println(add.apply(3, 5)); // 出力: 8
標準の関数型インターフェースとして、java.util.function
パッケージが用意されています。
ラムダ式の実践例
以下にいくつかの実用的な例を示します。
コレクションのソート
List names = Arrays.asList("Taro", "Jiro", "Hanako");
names.sort((a, b) -> a.compareTo(b));
System.out.println(names); // 出力: [Hanako, Jiro, Taro]
イベントリスナーの実装
button.addActionListener(e -> System.out.println("Button clicked!"));
独自ロジックのインジェクション
List numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(n -> {
if (n % 2 == 0) System.out.println(n + " is even");
});
Stream APIとの組み合わせ
Stream APIは、コレクションや配列のデータ操作を簡略化する機能で、ラムダ式との組み合わせが強力です。
フィルタリングとマッピング
List names = Arrays.asList("Taro", "Jiro", "Hanako");
names.stream()
.filter(name -> name.startsWith("H"))
.map(String::toUpperCase)
.forEach(System.out::println); // 出力: HANAKO
集約操作
int sum = Arrays.asList(1, 2, 3, 4, 5).stream()
.reduce(0, (a, b) -> a + b);
System.out.println(sum); // 出力: 15
ラムダ式の利点と制約
ラムダ式を使うことで得られる主な利点は以下の通りです:
- コードの簡略化と可読性の向上
- 匿名クラスを置き換えることで冗長性を削減
- 関数型プログラミングの要素を活用可能
一方で、制約もいくつかあります:
- 複雑なロジックをラムダ式に詰め込みすぎると可読性が低下
- デバッグが難しくなる場合がある
- 特定の場面ではパフォーマンスに影響を与える可能性