Java8で追加されたAPI StringJoiner編

【前提条件】

[環境]
[参考資料]

Java8 APIドキュメント
http://docs.oracle.com/javase/jp/8/api/

【概要】

前回はString#joinメソッドについて調べましたが、
今回はStringJoinerクラスについて調べてみます。

StringJoinerクラスはその名前のとおり、
Stringを結合するためのクラスです。

文字列結合と言うとStringBuilderクラスが思い浮かぶと思いますが、
StringBuilderと違いカンマ区切りにしたり、prefix/suffixをつけたりと
少しだけ高機能です。

【基本的な使い方】

まずはdelimiterをつけるという一番簡単な例を見てみます。

[サンプルコード]
    private static void execute01() {

        final StringJoiner joiner = new StringJoiner(",");

        joiner.add("one");
        joiner.add(null);
        joiner.add("two");
        joiner.add("");
        joiner.add("three");

        System.out.println(joiner.toString());
    }

StringJoinerのコンストラクタは2つありますが、
Stringが1つのものを使用した場合、delimiterのみが指定されます。

生成したStringJoinerオブジェクトに対して
addメソッドで文字列を追加していきます。

最終的に文字列に戻す場合はtoStringメソッドを使います。

[実行結果]
one,null,two,,three

addメソッドで追加した値がdelimiterで指定した、
カンマで区切られているのがわかります。

null、ブランクについても出力されていることがわかります。

【prefix/suffixをつける】

続いてdelimiter、prefix,suffixをつけるパターンを見てみます。

[サンプルコード]
    private static void execute02() {

        final StringJoiner joiner = new StringJoiner(",", "<pre>", "</pre>");

        joiner.add("one");
        joiner.add("two");
        joiner.add("three");

        System.out.println(joiner.toString());
    }

最初のパラメータがdelimiter、2つめがprefix、最後がsuffixになります。

[実行結果]
<pre>one,null,two,,three</pre>

追加した値同士はカンマで区切られ、prefix/suffixがついています。

パラメータが1つだった場合は内部的にprefix/suffixが指定されています。
下記のコードは同じになります。

    final StringJoiner joiner1 = new StringJoiner(",");
    final StringJoiner joiner2 = new StringJoiner(",", "", "");

【追加された値がない場合】

つづいてStringJoinerオブジェクトに値が追加されていない場合を見てみます。

[サンプルコード1]
    System.out.println(new StringJoiner(",", "<pre>", "</pre>").toString());

StringJoinerオブジェクトを生成して何もせずにtoStringメソッドを呼び出しています。

[実行結果1]
<pre></pre>

prefix/suffixのみが出力されています。

StringJoinerオブジェクトが空だった場合、
デフォルトではprefix/とsuffixが出力されます。

[サンプルコード2]
    private static void execute03() {

        final StringJoiner joiner = new StringJoiner(",", "<pre>", "</pre>");
        joiner.setEmptyValue("empty");

        System.out.println(joiner.toString());

        joiner.add("one");
        joiner.add("two");
        joiner.add("three");

        System.out.println(joiner.toString());
    }

StringJoinerクラスにはsetEmptyValueメソッドと言うのがあり、
オブジェクトの中身が空だった場合に
toStringで返却される値を指定することができます。

サンプルでは値を追加する前と追加したあとで
コンソール出力しています。

[実行結果]
empty
<pre>one,two,three</pre>

StringJoinerオブジェクトに値が設定されていない場合は
setEmptyValueメソッドで指定した値が出力されていることがわかります。

setEmptyValuemメソッドは自分自身のオブジェクトを返却するので、
下記のような書き方もできます。

    final StringJoiner joiner = new StringJoiner(",", "<pre>", "</pre>").setEmptyValue("empty");

【mergeメソッド】

mergeメソッドはその名のとおり、StringJoiner同士をマージします。

[サンプルコード]
    private static void execute04() {

        final StringJoiner joiner = new StringJoiner(",", "<pre>", "</pre>");

        joiner.add("one");
        joiner.add("two");
        joiner.add("three");

    
        final StringJoiner joiner2 = new StringJoiner(",", "<pre2>", "</pre2>");
        joiner2.add("four");
        joiner2.add("five");
        joiner2.add("six");

        joiner.merge(joiner2);
        
        System.out.println(joiner.toString());
    }

StringJoinerオブジェクトを2つつくって、
mergeメソッドを呼び出しています。

[実行結果]
<pre>one,two,three,four,five,six</pre>

サンプルコードでマージ元オブジェクト(変数名:joiner2)で追加した値が、
マージ先オブジェクト(変数名:joiner1)に追加され出力されていることわかります。

delimiter/prefix/suffixの設定値はマージされません。
マージされるのは追加した値のみです。

【まとめ】

新しく追加されたStringJoinerを見てきました。

今までStringBuilderクラスを使って、
色々とチェックし処理をしていたものが不要になります。

古いJavaではJSON/XMLを返すとなると文字列結合に頼っていましたが、
JavaEEではBeanで返せば勝手に変換してくれているので、
StringJoinerクラスを使用する機会は少ないそうかなと思います。

それでも複雑な文字列結合をする場合は
StringJoinerクラスを使ったほうが楽なパターンもあると思うので、
覚えておいて損はないと思います。