Java8で追加されたAPI StringJoiner編
【概要】
前回は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の設定値はマージされません。
マージされるのは追加した値のみです。