カテゴリ: Java 更新日: 2026/08/04

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の集約に使うメソッド

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

collectを使ってStreamをSetに変換すると、同じ値が複数あっても自動的に重複を取り除いてくれます。データの中に何度も同じ要素が入っている場合、「重複を消したい」という場面はよくあります。そんなときに最も手軽でシンプルに使えるのがCollectors.toSet()です。

Setは「同じ値を2回入れない」という性質を持つコレクションなので、Streamの処理結果をそのまま渡すだけでユニークなデータだけが残ります。初心者の方でも直感的に理解しやすく、用途も非常に幅広い基本テクニックです。


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

Set<String> uniqueFruits = fruits.stream()
    .collect(Collectors.toSet());

System.out.println(uniqueFruits);

[banana, orange, apple]

この例では、fruitsというリストに同じ文字列が2回含まれています。しかし、Streamに流してCollectors.toSet()で集約すると、結果として重複のないデータだけがセットとして残ります。表示順が毎回異なることがありますが、これはSetの特性であり問題ではありません。

重複を取り除きたいだけなら、複雑な処理を考える必要はありません。まずはこのように「Stream → Set」の基本形を覚えておくと、実務でも自然と活用できるようになります。

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

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

collectを使えば、StreamのデータをMap(キーと値のセット)に変換することもできます。リストを単に並べ替えるのではなく、「どの値をキーにして」「どの値を対応するデータとして保持するか」を自分で決められるため、少し応用的ですが非常に便利な使い方です。

特に、「名前とその長さ」「商品名と価格」「IDとユーザー情報」のように、データをペアで扱いたい場面ではtoMapが大活躍します。初心者の方でも、キーと値をどのように作るかをイメージできればすぐに使いこなせます。


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}

このコードでは、リストにある文字列をそのままキーにし、値として文字列の長さを指定しています。このように、toMapは「キーはどう作るか」「値はどう作るか」を2つのラムダ式で指定する仕組みになっています。

まずはこの基本形を覚えておくと、後からより複雑なデータ構造に応用するときにも迷わず使えるようになります。「キーと値をセットで扱いたいときはtoMap」という感覚を持っておくと、Javaのデータ処理がぐっと楽になります。

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を使うときの注意点とベストプラクティス

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で処理したデータをリストやセット、マップ、文字列などのコレクションに変換してまとめるために使われます。

JavaのStreamでデータをListに変換するにはどうすればよいですか?

Streamのあとにcollectメソッドを使い、Collectors.toListを指定することで、処理結果をListに変換することができます。
この記事が含まれる講座
カテゴリの一覧へ
新着記事
New1
Thymeleaf
Thymeleafの#mapsユーティリティとは?初心者向けマップ操作ガイド
更新記事
New2
Thymeleaf
Thymeleafの#arraysユーティリティとは?初心者向け配列操作ガイド
更新記事
New3
Thymeleaf
Thymeleafの#strings.sizeメソッドとは?初心者向け文字列の長さ取得ガイド
更新記事
New4
Thymeleaf
Thymeleafの#datesユーティリティとは?初心者向け日付操作ガイド
更新記事
人気記事
No.1
Java&Spring記事人気No1
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.2
Java&Spring記事人気No2
Java
Javaのクラスとインスタンス化、コンストラクタの使い方完全ガイド!初心者でもわかるオブジェクト指向の基礎
No.3
Java&Spring記事人気No3
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.4
Java&Spring記事人気No4
Java
JavaのDateクラスの使い方を完全ガイド!初心者でもわかる日付操作
No.5
Java&Spring記事人気No5
Java
JavaのExceptionクラスを完全解説!初心者でも理解できる例外処理の基本
No.6
Java&Spring記事人気No6
Java
Java開発環境「Eclipse(Pleiades)」のインストール方法とメリットを初心者向けに解説
No.7
Java&Spring記事人気No7
Thymeleaf
Thymeleafのth:hrefの使い方を全解説。初心者でも完璧に理解できるガイド
No.8
Java&Spring記事人気No8
Thymeleaf
Thymeleafのth:valueの使い方を解説!フォーム入力値を保持したり動的に表示する方法