joining(Collectors.joining) — 文字列結合
Stream API の Collectors.joining は、ストリームの要素を 文字列として結合するための便利な終端操作です。SQL の GROUP_CONCAT や STRING_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 の便利さが体感できます。
