【プログラミングしてみよう17】Javaのラムダ式とStream APIでコレクション操作をスッキリ書く

Java

前回はジェネリクスを学び、型安全なクラスやメソッドの作り方を理解しました。 今回は「ラムダ式」と「Stream API」について解説します。 これらを使うことで、ArrayListなどのコレクションに対する処理を、これまでよりずっとシンプルに書けるようになります。

ラムダ式の基本

ラムダ式とは、メソッドを短く簡潔に書くための記法です。Java 8から導入されました。 たとえば、リストの全要素を表示するためにこれまではfor文を使っていました。

for (String name : names) {
    System.out.println(name);
}

ラムダ式を使うと、同じ処理を次のように1行で書くことができます。

names.forEach(name -> System.out.println(name));

-> がラムダ式の記号で、左側に引数、右側に処理を書きます。

(引数) -> 処理

Stream APIの基本

Stream APIは、コレクション(ArrayListなど)に対して「絞り込み」「変換」「集計」などの操作をつなげて書ける仕組みです。Stream APIもJava 8から導入されました。

よく使うメソッドは以下の3つです。

// filter: 条件に合う要素だけを絞り込む
// map: 各要素を別の値に変換する
// collect: 結果をリストなどにまとめる

これらをメソッドチェーンでつなげることで、コレクションに対する複数の操作を1つの流れとして書くことができます。

サンプルコード(ラムダ式とStream API)

ファイル作成

「Java06」フォルダに StreamTest.java という名前でファイルを作成します

コード入力

以下のコードを入力します。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamTest {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("ぱんまる");
        names.add("たろう");
        names.add("はなこ");
        names.add("ぱんだ");

        // ラムダ式で全要素を表示
        System.out.println("--- 全員 ---");
        names.forEach(name -> System.out.println(name));

        // 「ぱ」から始まる名前だけ絞り込む
        System.out.println("--- 「ぱ」から始まる名前 ---");
        List<String> filtered = names.stream()
                .filter(name -> name.startsWith("ぱ"))
                .collect(Collectors.toList());
        filtered.forEach(name -> System.out.println(name));

        // 名前の文字数を数えてリストにする
        System.out.println("--- 名前の文字数 ---");
        List<Integer> lengths = names.stream()
                .map(name -> name.length())
                .collect(Collectors.toList());
        lengths.forEach(len -> System.out.println(len + "文字"));
    }
}

コンパイル

javac StreamTest.java

実行

java StreamTest

実行結果は次のようになります。

--- 全員 ---
ぱんまる
たろう
はなこ
ぱんだ
--- 「ぱ」から始まる名前 ---
ぱんまる
ぱんだ
--- 名前の文字数 ---
4文字
3文字
3文字
3文字

コードの解説

names.forEach(name -> System.out.println(name)) は、リストの各要素を name という変数で受け取り、System.out.println(name) を実行しています。-> の左側が引数、右側が処理です。これまでのfor-each文と同じ動きですが、より短く書けます。

names.stream() でリストをStream(ストリーム)に変換します。Streamとは、コレクションの要素を流れるように処理するための仕組みです。

filter(name -> name.startsWith("ぱ")) は、条件に合う要素だけを絞り込む操作です。startsWith("ぱ") は文字列が「ぱ」で始まるかどうかを判定するメソッドです。条件にはラムダ式を使い、true を返す要素だけが次の処理に渡されます。

map(name -> name.length()) は、各要素を別の値に変換する操作です。ここでは文字列の長さ(length())に変換しています。map を使うことで、Streamの中身を別の型や値に変えることができます。

collect(Collectors.toList()) は、Streamの処理結果をArrayListとしてまとめます。Streamはそのままでは処理を実行せず、collect などの「終端操作」が呼ばれた時点でまとめて処理が実行される仕組みになっています。

これらをメソッドチェーンでつなげることで、「絞り込み→変換→まとめる」という一連の処理を1つの流れとして書けるのがStream APIの大きな魅力です。for文とif文を組み合わせていた処理が、より宣言的で読みやすいコードになります。

まとめ

ラムダ式を使うことで、メソッドの処理を -> を使って短く書けるようになります。Stream APIと組み合わせることで、コレクションの絞り込み・変換・集計といった操作を、メソッドチェーンでスッキリと書けるようになります。filter で絞り込み、map で変換し、collect で結果をまとめるという基本の流れを覚えておきましょう。ラムダ式とStream APIはJavaの現場でも広く使われている機能です。これまで学んできたfor文やif文での書き方と見比べながら、より読みやすいコードへと磨いていきましょう。

2026/06/26(金) ぱんまる

コメント

タイトルとURLをコピーしました