【Java】文字列をカンマ区切りで結合する方法|String.join・StringJoiner・Collectors.joining

Javaで「リストや配列の要素をカンマ区切りの1つの文字列にしたい」というのは、CSVの生成やログ出力などでよくある処理です。Javaには String.join()StringJoinerCollectors.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で filtermap を挟んで前処理してから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の文字列・コレクション操作に強くなれます。