Java 逆引き集 | joining(Collectors.joining) — 文字列結合

Java Java
スポンサーリンク

joining(Collectors.joining) — 文字列結合

Stream API の Collectors.joining は、ストリームの要素を 文字列として結合するための便利な終端操作です。SQL の GROUP_CONCATSTRING_AGG に近いイメージで、リストやセットの要素をまとめて一つの文字列にできます。


基本の使い方

  • Collectors.joining()
    → 区切りなしで結合。
  • Collectors.joining(delimiter)
    → 区切り文字を挟んで結合。
  • Collectors.joining(delimiter, prefix, suffix)
    → 区切り文字+先頭と末尾に文字列を付加して結合。

基本コード例

区切りなしで結合

import java.util.*;
import java.util.stream.*;

public class JoiningBasic {
    public static void main(String[] args) {
        List<String> words = List.of("Java","Stream","API");

        String joined = words.stream()
                            .collect(Collectors.joining());

        System.out.println(joined); // JavaStreamAPI
    }
}
Java

区切り文字を挟んで結合

List<String> words = List.of("Java","Stream","API");

String joined = words.stream()
                     .collect(Collectors.joining(", "));

System.out.println(joined); // Java, Stream, API
Java

区切り+前後に文字列を付加

List<String> words = List.of("A","B","C");

String joined = words.stream()
                     .collect(Collectors.joining(" | ", "[", "]"));

System.out.println(joined); // [A | B | C]
Java

例題で理解する

例題1: ユーザー名をカンマ区切りで表示

List<String> users = List.of("Tanaka","Sato","Ito");

String csv = users.stream()
                  .collect(Collectors.joining(","));

System.out.println(csv); // Tanaka,Sato,Ito
Java

例題2: ログメッセージをまとめて一行に

List<String> logs = List.of("WARN a","ERROR b","INFO c");

String line = logs.stream()
                  .collect(Collectors.joining(" / "));

System.out.println(line); // WARN a / ERROR b / INFO c
Java

例題3: SQL の IN 句を生成

List<Integer> ids = List.of(10,20,30);

String inClause = ids.stream()
                     .map(String::valueOf)
                     .collect(Collectors.joining(",", "(", ")"));

System.out.println(inClause); // (10,20,30)
Java

例題4: HTML リストを生成

List<String> items = List.of("apple","banana","cherry");

String html = items.stream()
                   .map(i -> "<li>" + i + "</li>")
                   .collect(Collectors.joining("\n", "<ul>\n", "\n</ul>"));

System.out.println(html);
/*
<ul>
<li>apple</li>
<li>banana</li>
<li>cherry</li>
</ul>
*/
Java

テンプレート集

  • 区切りなし
String s = stream.collect(Collectors.joining());
Java
  • 区切りあり
String s = stream.collect(Collectors.joining(", "));
Java
  • 区切り+前後文字
String s = stream.collect(Collectors.joining(" | ", "[", "]"));
Java
  • 数値を文字列化して結合
String s = nums.stream()
               .map(String::valueOf)
               .collect(Collectors.joining(","));
Java

落とし穴と回避策

  • null 要素: joining は null を処理できない。事前に filter(Objects::nonNull) で除外する。
  • 大量データ: 文字列連結はメモリを消費する。必要なら途中でファイル出力や StringBuilder を検討。
  • 区切りの最後に余計な文字: joining は「最後の要素の後には区切りを付けない」ので安心。自前ループより安全。

まとめ

  • Collectors.joining は「ストリーム要素を文字列にまとめる」ための定番。
  • 区切り・前後文字を指定できるので、CSV・SQL・HTML など幅広く応用できる。
  • null 除外や map での文字列化を組み合わせると、実務でも強力なツールになる。

👉 練習課題: 「社員リストから名前を ‘ | ‘ 区切りで結合し、前後に <names> タグを付ける」コードを書いてみると、joining の便利さが体感できます。

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