Java 逆引き集 | Collector joining with delimiter/prefix/suffix — レポート生成

Java Java
スポンサーリンク

Collector.joining with delimiter/prefix/suffix — レポート生成

Stream の要素を文字列としてまとめたいときに便利なのが Collectors.joining
単純な連結だけでなく、区切り文字(delimiter)・前置文字(prefix)・後置文字(suffix) を指定できるので、レポートや表形式の出力に役立ちます。


基本の仕組み

  • Collectors.joining()
    → 区切りなしで連結。
  • Collectors.joining(delimiter)
    → 区切り文字を指定して連結。
  • Collectors.joining(delimiter, prefix, suffix)
    → 区切り文字に加えて、全体の前置文字・後置文字を指定できる。

基本コード例

区切りなし

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

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

System.out.println(result); // applebananacherry
Java

区切りあり(カンマ区切り)

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

System.out.println(result); // apple, banana, cherry
Java

区切り+前置+後置

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

System.out.println(result); // [apple, banana, cherry]
Java

例題で理解する

例題1: レポート用の社員名一覧

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

String report = employees.stream()
    .collect(Collectors.joining(" / ", "社員一覧: ", "。"));

System.out.println(report);
// 社員一覧: Tanaka / Sato / Ito。
Java
  • ポイント: 区切りを「/」、前置に「社員一覧:」、後置に「。」を付けてレポート風に。

例題2: SQL の IN 句生成

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

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

System.out.println("WHERE id IN " + inClause);
// WHERE id IN (10, 20, 30)
Java
  • ポイント: prefix/suffix を使って括弧を付けると SQL 風に。

例題3: JSON 配列風の出力

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

String jsonArray = items.stream()
    .map(s -> "\"" + s + "\"")
    .collect(Collectors.joining(", ", "[", "]"));

System.out.println(jsonArray);
// ["A", "B", "C"]
Java
  • ポイント: 各要素を "..." で囲み、全体を [ ] で囲む。

テンプレート集

  • 単純連結
stream.collect(Collectors.joining());
Java
  • 区切り付き連結
stream.collect(Collectors.joining(delimiter));
Java
  • 区切り+前置+後置
stream.collect(Collectors.joining(delimiter, prefix, suffix));
Java
  • 要素を加工してから連結
stream.map(f -> transform(f))
      .collect(Collectors.joining(delimiter, prefix, suffix));
Java

落とし穴と回避策

  • null 要素: joining は null を扱えない。事前に filter(Objects::nonNull) を入れる。
  • 数値やオブジェクト: そのままでは文字列化されないので map(String::valueOf) を使う。
  • 大量データ: joining は全件をメモリにためてから連結する。巨大ファイル出力には BufferedWriter などを検討。

まとめ

  • Collectors.joining は文字列連結専用の Collector。
  • delimiter/prefix/suffix を指定するとレポートや SQL/JSON 風の出力が簡単に作れる。
  • null や非文字列は事前に処理しておくのが安全。

👉 練習課題: 「商品リストから [商品A | 商品B | 商品C] という形式のレポート文字列を生成」してみましょう。joining の delimiter/prefix/suffix の使い方が自然に身につきます。

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