カテゴリ: Java 更新日: 2026/02/27

Javaのラムダ式とStreamのcollectを完全ガイド!初心者でもわかるリスト変換と集約処理の基本

【ラムダ式】Stream入門:collectの基本と使い方
【ラムダ式】Stream入門:collectの基本と使い方

先生と生徒の会話形式で理解しよう

生徒

「JavaのStreamでデータを加工した後って、どうやってリストに戻せばいいんですか?」

先生

「それにはcollectメソッドを使いますよ。Streamで変換した結果をリストやマップ、セットにまとめるときに便利です。」

生徒

「なるほど…mapとかfilterのあとによく見かけるけど、イマイチ使い方がわかってなくて…」

先生

「では、基本から丁寧にcollectの使い方を学んでいきましょう!」

1. collectとは?Java Streamの集約に使うメソッド

「1. collectとは?Java Streamの集約に使うメソッド」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

1. collectとは?Java Streamの集約に使うメソッド
1. collectとは?Java Streamの集約に使うメソッド

Javaのcollectメソッドは、Streamで処理した要素を「最後にどうまとめるか」を決めるためのメソッドです。Streamで流れてきたデータを、ListSetMapなどのコレクションに変換したり、1つの値に集約したりするときに使います。

イメージとしては、「ベルトコンベアで流れてくる商品(Stream)」を「箱やカゴ(List・Set・Map)」にしまう役目をするのがcollectです。途中でmapfilterで加工したあと、最後にどの入れ物に集めるかを指定するのがcollectだと考えるとわかりやすいです。

また、Streamは一度使うと再利用できない「使い捨て型」です。そのため、画面表示や別の処理でまた使いたい場合には、collectで一度コレクション(Listなど)に戻しておくのが一般的なパターンになります。


List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

List<String> result = names.stream()
    .collect(Collectors.toList());

System.out.println(result);

[Alice, Bob, Charlie]

このサンプルでは、もともとのnamesリストからStreamを作り、そのままcollect(Collectors.toList())で新しいListに集約しています。まだmapfilterなどの複雑な処理はしていませんが、「Streamで流したものを最後にリストとして受け取る」という、collectの基本イメージをつかむには十分です。

このように、collectはStream処理の「締めくくり」にあたる重要なメソッドです。まずは「Streamの結果をコレクションにまとめる入口」として覚えておくと、後で他のメソッドと組み合わせるときにも理解しやすくなります。

2. collectの基本的な使い方:Listに変換する

2. collectの基本的な使い方:Listに変換する
2. collectの基本的な使い方:Listに変換する

collectの中でも、まず覚えておきたいのが「StreamをListに変換する」基本パターンです。すでにあるリストからStreamを作り、途中で加工やフィルタリングを行い、最後にまたリストとして受け取る、という流れはJavaのStream処理でよく登場します。

特に、画面に一覧表示したいときや、別のメソッドに結果のリストを渡したいときなど、「最終的にはListが欲しい」という場面はとても多いです。そのときに使うのがCollectors.toList()です。


List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

List<Integer> doubled = numbers.stream()
    .map(n -> n * 2)
    .collect(Collectors.toList());

System.out.println(doubled);

[2, 4, 6, 8, 10]

このサンプルでは、まずnumbersという整数のリストからStreamを作っています。次にmap(n -> n * 2)で、1つ1つの値を2倍に変換しています。そのあとにcollect(Collectors.toList())を呼び出すことで、「2倍にされた値だけが入った新しいList」を作り、それをdoubledという変数に代入しています。

ポイントは、「元のリストnumbersはそのまま残り、加工後の結果だけを別のリストとして受け取っている」という点です。つまり、元のデータを壊さずに、新しいリストを作ることができます。これにより、元のリストもあとで再利用できますし、テストやデバッグもしやすくなります。

プログラミング初心者の方は、まず「Streamで処理したあと、collect(Collectors.toList())でリストに戻す」という流れを体で覚えると良いです。mapfilterの内容が変わっても、「最後はtoList()で新しいリストにする」という形は同じなので、JavaのStreamとcollectの基本的な使い方をしっかり練習できます。

3. Setに変換するには?重複を排除したいときのcollect

3. Setに変換するには?重複を排除したいときのcollect
3. Setに変換するには?重複を排除したいときのcollect

Streamの結果をSetに変換すれば、重複を自動的に取り除くことができます。次の例では、同じ値が複数あるリストをSetに変換しています。


List<String> fruits = Arrays.asList("apple", "banana", "apple", "orange");
Set<String> uniqueFruits = fruits.stream()
    .collect(Collectors.toSet());
System.out.println(uniqueFruits);

[banana, orange, apple]

表示順は保証されませんが、Setにすることでユニークな要素だけが残ります。

4. Mapへの変換方法:キーと値を指定するcollect

「4. Mapへの変換方法:キーと値を指定するcollect」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

4. Mapへの変換方法:キーと値を指定するcollect
4. Mapへの変換方法:キーと値を指定するcollect

StreamをMapに変換することも可能です。以下の例では、文字列のリストを使って、各文字列とその長さをMapに変換しています。


List<String> names = Arrays.asList("Java", "Python", "Go");
Map<String, Integer> nameLengthMap = names.stream()
    .collect(Collectors.toMap(
        name -> name,
        name -> name.length()
    ));
System.out.println(nameLengthMap);

{Java=4, Python=6, Go=2}

Collectors.toMapでは、キーと値をラムダ式で明示的に定義する必要があります。

5. joiningで文字列を結合するcollectの使い方

5. joiningで文字列を結合するcollectの使い方
5. joiningで文字列を結合するcollectの使い方

Collectors.joining()は、Streamの文字列を1つに結合するために使われます。以下はカンマ区切りで文字列を連結する例です。


List<String> words = Arrays.asList("Java", "Stream", "Collect");
String joined = words.stream()
    .collect(Collectors.joining(", "));
System.out.println(joined);

Java, Stream, Collect

このように文字列のリストを整形したい場面ではjoiningが非常に便利です。

6. groupingByでグルーピング処理を実現する

6. groupingByでグルーピング処理を実現する
6. groupingByでグルーピング処理を実現する

Collectors.groupingBy()を使うと、ある条件でデータをグループに分けることができます。以下は、名前の長さごとにグループ分けをする例です。


Map<Integer, List<String>> grouped = names.stream()
    .collect(Collectors.groupingBy(name -> name.length()));
System.out.println(grouped);

{2=[Go], 4=[Java], 6=[Python]}

groupingByは集計・集約処理に非常によく使われるテクニックの一つです。

7. collectを使うときの注意点とベストプラクティス

「7. collectを使うときの注意点とベストプラクティス」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

7. collectを使うときの注意点とベストプラクティス
7. collectを使うときの注意点とベストプラクティス

collectは非常に便利なメソッドですが、以下のポイントに注意するとより効果的に使えます。

  • toMapはキーが重複すると例外になるので事前に確認が必要
  • joiningは文字列のみ対応。nullが含まれるとNullPointerExceptionになることも
  • groupingByと組み合わせてcountingmappingも利用できる

ラムダ式とStream APIを活用することで、データ処理のコードがシンプルかつ強力になります。collectはその中核となる機能の一つなので、しっかりマスターしておきましょう。

まとめ

まとめ
まとめ

今回の記事では、Javaのラムダ式とStream APIの中でも特に重要な役割を持つcollectメソッドについて、基礎から応用まで丁寧に整理しました。Stream処理はJavaでデータを扱う際に非常に便利な仕組みとして広く利用されており、特にmapfilterと組み合わせて行うリスト加工や検索、変換処理では欠かせない存在です。そのStreamの最後に使われることが多いのが、このcollectメソッドです。

collectは、Streamで加工されたデータをListSetMapなどのコレクションへ変換したり、文字列を結合したり、グループ化したりといった「結果をまとめる処理」を担当します。データを一時的に流れとして扱うStreamは、そのままでは再利用できないため、collectでコレクションに変換して保持しておくことが欠かせません。これはプログラムの構造をわかりやすくし、データ処理を確実に実行するための重要な要素です。

また、Collectors.toList()Collectors.toSet()Collectors.toMap()などの代表的なCollectorを理解することで、状況に応じた最適なデータ形式への変換が可能になります。処理後の結果をリストで扱いたい場合や、重複を避けたい場合、キーと値の組み合わせで管理したい場合など、データの扱い方に応じて柔軟な変換ができる点が大きなメリットです。さらに、文字列を結合するjoining、条件でグループ化するgroupingByなど、業務システムでも頻繁に使われる集計処理も簡潔に記述できるのが特徴です。

特にgroupingBymappingcountingなどを組み合わせた集約処理は、集計表の作成や分類処理などで非常に役立ちます。こうした処理は以前は複雑なループや集計のための補助変数を使って書く必要がありましたが、Streamとcollectを使えば直感的で読みやすい形で記述できます。これにより、コードの可読性や保守性が大きく向上し、バグの発生も抑えられます。

一方で、注意すべき点もいくつかあります。toMapではキーの重複があると例外が発生するため事前チェックが必要であったり、joiningではnullが含まれると例外が出る可能性があります。また、Stream APIは「副作用を避ける」ことを前提に設計されているため、mapfilter内では状態を持った処理を避け、戻り値に専念した実装を心がけることが大切です。

以下に今回の内容をより深く理解できるサンプルコードを掲載します。複数のCollectorを組み合わせた実践的な処理として参考にしてください。

サンプルプログラム:collectで多様なデータ変換と集約をまとめて実践


List<String> items = Arrays.asList("apple", "banana", "orange", "apple", "melon");

// Listへの変換
List<String> listResult = items.stream()
    .collect(Collectors.toList());

// Setへの変換(重複排除)
Set<String> setResult = items.stream()
    .collect(Collectors.toSet());

// Mapへの変換(文字列 → 長さ)
Map<String, Integer> lengthMap = items.stream()
    .distinct()
    .collect(Collectors.toMap(
        item -> item,
        item -> item.length()
    ));

// 文字列の結合
String joined = items.stream()
    .collect(Collectors.joining(", "));

// 長さごとのグルーピング
Map<Integer, List<String>> grouped = items.stream()
    .collect(Collectors.groupingBy(String::length));

System.out.println(listResult);
System.out.println(setResult);
System.out.println(lengthMap);
System.out.println(joined);
System.out.println(grouped);

このサンプルでは、collectが持つ多様な活用方法をひとまとめに確認でき、実際に開発現場でよく遭遇する処理ばかりです。データの重複除去、グループ化、文字列の整形、リスト・セット・マップへの変換など、すべてStreamとcollectの組み合わせで表現できることがわかります。これらの技術を身につけることで、Javaでのデータ処理スキルが大きく向上するでしょう。

先生と生徒の振り返り会話

生徒

「collectって色んな使い方ができるんですね!リストに戻すだけじゃなくて、セットやマップにも変換できるなんて知りませんでした。」

先生

「そうですね。Streamで加工したデータをどう保存するかはとても重要です。toListtoSettoMap、どれを使うかでデータの扱い方が大きく変わります。」

生徒

「joiningで文字列をまとめるのも便利ですね!CSVみたいな形式を作るときにも使えそうです。」

先生

「その通り。特にログや画面表示用の文字列を作るときには重宝します。グルーピングもデータ分析や集計で役立ちますよ。」

生徒

「ただ、toMapのキー重複とか、気をつけるポイントもありましたね。しっかり覚えておきます。」

先生

「注意点を理解していれば、Streamとcollectはとても強力な道具になります。今日学んだ内容をぜひ実際のコードで試してみてください。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JavaのStreamでcollectメソッドは何のために使うのですか?

Javaのcollectメソッドは、Streamで処理したデータをリストやセット、マップ、文字列などのコレクションに変換してまとめるために使われます。
カテゴリの一覧へ
新着記事
New1
Java
JavaのStreamのreduceを完全解説!初心者でもわかる集約処理の基本
新規投稿
New2
Spring
Javaの@withinアノテーションを初心者向けに解説!Spring AOPでの使い方を完全ガイド
更新記事
New3
Spring
Springの@AfterThrowingアノテーションの使い方を完全ガイド!初心者でもわかる例外処理
更新記事
New4
Spring
Javaの@AfterReturningアノテーションの使い方を完全ガイド!初心者でもわかるAOP入門
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Thymeleaf
Thymeleafのth:checkedの使い方!チェックボックスON/OFFを動的に制御する方法
No.3
Java&Spring記事人気No3
Thymeleaf
Thymeleaf(タイムリーフ)の使い方入門!初心者でもわかるth:textの基礎
No.4
Java&Spring記事人気No4
Java
Javaの抽象クラス(abstract)を完全ガイド!継承と設計のルールを学ぶ
No.5
Java&Spring記事人気No5
Spring
Spring BootのMultipartFile入門:ファイルアップロード・ダウンロードの実装方法と制限設定
No.6
Java&Spring記事人気No6
Spring
Thymeleaf(タイムリーフ)入門!初心者でもわかるSpring Bootとテンプレートエンジンの使い方
No.7
Java&Spring記事人気No7
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.8
Java&Spring記事人気No8
Thymeleaf
Thymeleafのth:blockの使い方を完全ガイド!初心者でもわかるテンプレートブロック管理