Javaの関数型プログラミング入門

この記事では、Javaでの関数型プログラミングについて説明します。Java 8から導入されたラムダ式やストリームAPIを中心に、関数型プログラミングの基本的な概念とその利用方法を解説します。

目次

  1. 関数型プログラミングとは
  2. Javaでの関数型インターフェース
  3. ラムダ式とは
  4. ストリームAPIとは
  5. コード例: ラムダ式とストリームAPIを使った処理

1. 関数型プログラミングとは

関数型プログラミング(Functional Programming, FP)は、計算を一連の評価される表現(または「純粋な」関数)で見ることを重視するソフトウェア開発パラダイムです。FPでは副作用がないことが理想的であり、これによりコードが予測可能でテストしやすくなります。

2. Javaでの関数型インターフェース

Javaでは@FunctionalInterfaceアノテーションが付けられたインターフェースが"関数型インターフェース"です。これらのインターフェースは一つだけ抽象メソッドを持ちます。例えばjava.util.function.Predicate<T> インタフェースです。

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

3. ラムダ式とは

Java 8から導入された「ラムダ式」(Lambda expressions) を使用することで、簡潔にコードを書くことが可能になりました。特にコレクション操作やスレッド処理等で便利です。

Runnable r = () -> System.out.println("Hello, World!");
new Thread(r).start();

4. ストリームAPIとは

Java 8では「Stream API」も導入されました。これにより配列やコレクション等のデータを関数型スタイルで処理することが可能になりました。

List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
list.stream().filter(s -> s.startsWith("A")).forEach(System.out::println);

5. コード例: ラムダ式とストリームAPIを使った処理

以下はラムダ式とストリームAPIを組み合わせたコード例です。このコードでは、整数のリストから偶数だけを抽出し、それらの平方の合計を計算します。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sumOfSquares = numbers.stream()
                          .filter(n -> n % 2 == 0)
                          .map(n -> n * n)
                          .reduce(0, Integer::sum);
System.out.println(sumOfSquares); // 出力: 56

以上、Javaでの関数型プログラミングについて説明しました。これらの概念とテクニックはJavaプログラミングにおいて非常に重要であり、特に並行処理や大量データ操作等でその効果を発揮します。