Java8から文字列結合のAPIにStringJoinerが追加されました。
これ思った以上に便利な機能なので、似たようなメソッドやユーティリティを実装する前に検討してみましょう。
コンストラクタ
次の2種類が用意されています。
コンストラクタ | 説明 |
---|---|
StringJoiner(CharSequence delimiter) | 第1引数を区切り文字とした連結文字列を生成します |
StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) | 第1引数を区切り文字とし、第2引数を先頭、第3引数を末尾とした連結文字列を生成します |
引数はCharSequenceですが、利用する際にはStringで良いです。
使い方
例えば引数が1つの場合を使ってみましょう。
public void sampleA() {
List<String> list = Arrays.asList("カピバラ", "ソルト", "のり");
StringJoiner join = new StringJoiner(",");
// リストの要素を1つ取り出すたびにStringJoinerへ追加する。
list.stream().forEach(e -> join.add(e));
System.out.println(join.toString());
}
このメソッドの実行結果は次のようになります。
カピバラ,ソルト,のり
第1引数の文字を区切り文字として、StringJoinerに追加されたものが出力されました。
接頭辞+接尾辞を指定する
引数が3つあるコンストラクタを使えば、CSVやJSONのような出力にも使えます。
CSVライクな例
public void testCSV() {
List<String> list = Arrays.asList("カピバラ", "ソルト", "のり");
StringJoiner join = new StringJoiner("','", "'", "'");
list.stream().forEach(e -> join.add(e));
System.out.println(join.toString());
}
実行結果
'カピバラ','ソルト','のり'
JSONライクな例
public void testJson() {
Map<String, String> map = new HashMap<>();
map.put("名前", "ソルト");
map.put("年齢", "2歳");
map.put("性別", "メス");
StringJoiner join = new StringJoiner(",", "{", "}");
map.entrySet().stream().forEach(m -> join.add(m.getKey() + ":" + m.getValue()));
System.out.println(join.toString());
}
実行結果
{年齢:2歳,性別:メス,名前:ソルト}
URLのクエリ文字列
先頭だけ?で始まり、以降は&でつなげる、のような場合にも使えます。
Map<String,String> map = new HashMap<>();
map.put("名前", "ソルト");
map.put("年齢", "2歳");
map.put("性別", "メス");
StringJoiner join = new StringJoiner("&","?","");
map.entrySet().stream().forEach(m -> join.add(m.getKey() + "=" + m.getValue()));
System.out.println(join.toString());
実行結果
?年齢=2歳&性別=メス&名前=ソルト