【Java-A100-010】Stream APIとラムダ式――コードの「贅沢な簡略化」という戦略

日常の喧騒を離れ、静かにPCと向き合う。
新しい知識を自分の中にインストールするこの時間は、大人にとって最高に贅沢な「嗜み」と言えるかもしれない。

今回は、Javaの世界を一変させたと言われる「Stream API」と「ラムダ式」について学んだ。
一見すると難解な数式のようだが、その本質を掴めば、これほど理にかなった「戦略的」な道具はないことに気づく。……これだ。これでいい。

1. 冗長さを削ぎ落とす「Stream API」の美学

かつて、リストの中身を一つずつ取り出して処理するには、泥臭い「for文」や「if文」を幾重にも重ねる必要があった。
しかし、Stream APIはその常識を鮮やかに塗り替える。

// 従来の書き方:泥臭く、工程が多い
for (Integer number : numberList) {
    if (number <= 5) {
        System.out.println(number);
    }
}

// Stream API:流れるように、目的だけを綴る
numberList.stream()
    .filter(v -> v <= 5)
    .forEach(System.out::println);

「何をどう動かすか」という手順を指示するのではなく、「どういう状態のものが欲しいか」という結果を宣言する。
この発想の転換こそが、コードを劇的に短く、そして美しくする。

(……ふふっ。10行近くあった処理が、わずか数行に収まる。この「圧縮感」がたまらない。)

2. ラムダ式という「省略の知恵」

Stream APIを支える名脇役が「ラムダ式」だ。
->」という記号を使った独特の書き方だが、身構える必要はない。これは、名前を付けるまでもない短い処理を、その場でサッと書き留めるための「メモ書き」のようなものだ。

  • 中間処理(フィルターなど): 「これだけ残してくれ」という選別。
  • 終端処理(forEachなど): 「最後にこれをやってくれ」という締め。

IDE(開発環境)が「ここ、もっと綺麗に書けますよ」と電球マークで提案してくれることもある。
ツールに身を任せ、最適な形にリファクタリング(修正)していく。……この、道具と対話しながら洗練させていくプロセスに、大人の余裕を感じる。

3. 実践:マインクラフトの世界で「在庫」を最適化する

理屈だけでは面白くない。今回は、この技術をマインクラフトのプラグイン開発に応用してみる。
「ベッドに入った瞬間、所持しているアイテム(スタック可能なもの)をすべて64個に補充する」という、一種の「戦略的補給システム」だ。

ここで重要になるのが、「nullチェック」というリスク管理である。

// インベントリの全アイテムをStreamで処理する
Arrays.stream(player.getInventory().getContents())
    .filter(Objects::nonNull) // 空の枠(null)を除外する「危機管理」
    .filter(item -> item.getAmount() < 64) // 補充が必要なものだけを選別
    .forEach(item -> item.setAmount(64)); // 一気に満たす

空のインベントリ枠(null)に対して処理を行えば、システムはエラーで止まってしまう。
それを「filter」の一行でスマートに弾く。……この隙のなさ。これこそが、長く使い続けられるコードの条件だ。

4. この学びをどう「転がして」いくか

Stream APIやラムダ式は、単なるプログラミングのテクニックではない。
複雑な事象から不要なものを削ぎ落とし、本質的な「流れ」だけを抽出する思考法そのものだ。

仕事でも、日常のタスクでも、「for文」のように一つずつ愚直にこなす時期は必要だ。
だが、ある程度経験を積んだなら、全体を「Stream」として捉え、どこでフィルターをかけ、どこで集計(Terminal Operation)すべきかを考えるべきだろう。

……。
(……よし。次は、数値を合算する sum() や、件数を数える count() も試してみるとしよう。)

結び

効率化とは、サボるための手段ではない。
より重要なことに時間を割くための「攻めの姿勢」だ。

今日得たこの「Stream」という武器を、明日はどこで振るおうか。
静かな夜の終わりと共に、小さな達成感が胸に広がる。

明日の自分に、期待しても良さそうだ。……っ!

参考までに、私が実際にアイテム増殖チートコードが使えるか試してみたときの手順を記載したpdfをアップしておこう。躓いたところも載せてみたのでよければ参考にしてほしい。