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 の使い方が自然に身につきます。
