Javaで「リストや配列の要素をカンマ区切りの1つの文字列にしたい」というのは、CSVの生成やログ出力などでよくある処理です。Javaには String.join()・StringJoiner・Collectors.joining() と複数の方法があり、対象(配列/List/Stream)や要件で使い分けます。この記事ではそれぞれの使い方と選び方を解説します。
この記事の結論:配列やListをそのままつなぐなら
String.join(", ", list) が最も簡潔です。接頭辞・接尾辞を付けたいなら StringJoiner、Streamで加工しながら結合するなら Collectors.joining() を使います。String.join()で結合する(最も簡潔)
String.join() は、第1引数の区切り文字で要素をつなぎます。配列でも List でもそのまま渡せるのが便利な点です。
String.join(List / 配列の両方OK)
import java.util.List;
public class Main {
public static void main(String[] args) {
// List をそのまま結合
List<String> fruits = List.of("Apple", "Banana", "Orange");
System.out.println(String.join(", ", fruits)); // Apple, Banana, Orange
// 配列も同様に結合できる
String[] arr = {"Apple", "Banana", "Orange"};
System.out.println(String.join(", ", arr)); // Apple, Banana, Orange
}
}
StringJoinerで接頭辞・接尾辞を付ける
StringJoiner は要素を順に add() でつなぐクラスです。区切り文字に加えて、前後を囲む接頭辞・接尾辞を指定できるのが特徴です。配列やListにせず、ループの中で1つずつ足していく場合に向いています。
StringJoiner([ ] で囲む例)
import java.util.StringJoiner;
public class Main {
public static void main(String[] args) {
// 区切り ", "、接頭辞 "[", 接尾辞 "]"
StringJoiner joiner = new StringJoiner(", ", "[", "]");
joiner.add("Apple");
joiner.add("Banana");
joiner.add("Orange");
System.out.println(joiner.toString()); // [Apple, Banana, Orange]
}
}
Collectors.joining()でStreamを結合する
Stream APIで加工しながら結合したい場合は Collectors.joining() が便利です。数値やオブジェクトのListを文字列に変換してから結合するケースで特に活躍します。
Collectors.joining(map と組み合わせ)
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 数値のリストをカンマ区切りに
List<Integer> nums = List.of(1, 2, 3);
String csv = nums.stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));
System.out.println(csv); // 1, 2, 3
// 接頭辞・接尾辞も指定できる
String wrapped = nums.stream()
.map(String::valueOf)
.collect(Collectors.joining(", ", "[", "]"));
System.out.println(wrapped); // [1, 2, 3]
}
}
オブジェクトのリストを結合するときは、
map() で「各要素を文字列にする」処理(例: map(User::getName))を挟みます。CSVファイルとして読み書きする方法はCSVファイルを読み込む方法も参考になります。null要素・空リストの扱い
String.join() に null 要素が含まれると、その部分は文字列 “null” として連結されます(例外にはなりません)。空のListを渡した場合は空文字が返ります。
null・空の挙動
import java.util.Arrays;
import java.util.List;
List<String> list = Arrays.asList("A", null, "C");
System.out.println(String.join(", ", list)); // A, null, C
System.out.println(String.join(", ", List.of())); // (空文字)
「null を空文字として扱いたい」「空要素を除外したい」場合は、Streamで
filter や map を挟んで前処理してからCollectors.joining() で結合すると安全です。よくある質問(FAQ)
QListとString配列、どちらでもString.joinは使えますか?
A使えます。
String.join(", ", list) のようにList もそのまま渡せますし、配列も同じく渡せます。わざわざ配列に変換する必要はありません。QStringJoinerとString.joinはどう使い分けますか?
A既にあるListや配列をつなぐだけなら
String.join() が簡潔です。前後を括弧などで囲みたい、またはループで1つずつ追加していくならStringJoiner(接頭辞・接尾辞が指定可能)が向いています。Q数値やオブジェクトのリストを結合するには?
AStreamを使い、
map() で各要素を文字列に変換してからCollectors.joining(", ") で結合します。例: nums.stream().map(String::valueOf).collect(Collectors.joining(", "))。Qnull要素があるとエラーになりますか?
Aなりません。
String.join() では null 要素は文字列「null」として連結されます。除外したい場合はStreamで filter(Objects::nonNull) などを挟んでください。まとめ
Javaで文字列をカンマ区切りで結合するポイントを整理します。
- 配列・Listをつなぐなら
String.join(", ", list)が最も簡潔 - 接頭辞・接尾辞を付けるなら
StringJoiner - Streamで加工しながら結合するなら
Collectors.joining() - 数値・オブジェクトは
map()で文字列化してから結合 - null要素は「null」として連結される(除外はStreamで前処理)
関連として、文字列を結合する5つの方法・CSVファイルを読み込む方法・リストの先頭要素を取得する方法もあわせて読むと、Javaの文字列・コレクション操作に強くなれます。
