LoginSignup
22
21

More than 5 years have passed since last update.

StringJoinerとstream

Posted at

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歳&性別=メス&名前=ソルト
22
21
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
21