【Java学習|初心者向け】Javaエンジニア必見!Stream APIの主要メソッドを使いこなしてデータ処理を効率化しよう

1. 導入:なぜStream APIが重要なのか

Javaのコレクション(ListやSet)を操作する際、これまではfor文やif文を何重にもネストさせて処理を書くことが一般的でした。しかし、この方法ではコードが長くなり、意図が伝わりにくくなるという課題があります。Java 8から導入されたStream APIは、データ処理を「宣言的」に記述できるため、可読性が高く、バグを減らした堅牢なコードを書くために不可欠な技術です。

2. 基礎知識:Stream APIとは

Stream APIは、コレクションなどのデータソースを「パイプライン」のように流し、順番に処理を行う仕組みです。

  • 中間操作: filterやmapのように、処理後のStreamを返すもの。複数つなげることができます。
  • 終端操作: collectやforEachのように、Streamを終了させ、結果(Listや数値など)を得るもの。

これらを組み合わせることで、複雑な抽出や変換を直感的に記述できます。

3. 実装/解決策:主要メソッドの使い分け

  • filter(): 条件に合う要素だけを抽出します。
  • map(): 要素を別の形(型)に変換します。
  • mapToInt/Long/Double(): 数値型のStreamに特化し、合計値や平均値を出しやすくします。
  • flatMap(): 「リストの中のリスト」のようなネストした構造を平坦化(フラット化)する際に使います。

4. サンプルプログラム

以下のコードは、商品リストから価格を抽出し、特定の条件で絞り込んで合計を出すまでの流れを実装したものです。


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

public class StreamExample {
public static void main(String[] args) {
// 商品リストを作成
List items = Arrays.asList("Apple:100", "Banana:200", "Cherry:300", "Date:150");

// 1. filter: 150円以上の商品に絞り込む
// 2. map: 文字列を数値(int)に変換
// 3. mapToInt: 数値専用のStreamに変換して合計を計算
int total = items.stream()
.filter(item -> Integer.parseInt(item.split(":")[1]) >= 150) // 150円以上の条件
.map(item -> item.split(":")[1]) // 価格部分のみ抽出
.mapToInt(Integer::parseInt) // Stringからintへ変換
.sum(); // 合計を算出

System.out.println("合計金額: " + total);
}
}

5. 応用・注意点:現場で役立つポイント

現場でよくある失敗として、「Streamを一度使った後に再利用しようとする」ケースがあります。Streamは一度終端操作(sumやcollectなど)を行うと再利用できません。また、flatMapは「List>」のような多重構造を扱う際に非常に強力ですが、慣れないうちは複雑になりがちです。まずはmapとfilterで基本的な流れを作り、必要に応じてflatMapを導入するのが成功の秘訣です。

また、Java 21から導入されたSequenced Collections(ListやDequeなどの順序付きコレクション)と組み合わせることで、先頭や末尾へのアクセスが容易になります。Stream APIと組み合わせて活用すれば、さらに高度で効率的なデータ処理が可能になりますよ。

コメント

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