commons-langのStrBuilder使い方メモ

Apache Commons Lang 3.1 の StrBuilder の使い方メモ。


#説明
StringBuilder, StringBuffer より柔軟でパワフルな文字列生成クラス。
StringBuilder と同じで __スレッドセーフではない__ 。

#使い方
##基本
```java:
import org.apache.commons.lang3.text.StrBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        StrBuilder sb = new StrBuilder();
        
        sb.append("a").append("b").append("c");
        System.out.println(sb);
    }
}
```

```text:出力結果
abc
```

基本的な使い方は StringBuilder/StringBuffer と同じ。

##isEmpty()
```java:
import org.apache.commons.lang3.text.StrBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        StrBuilder sb = new StrBuilder();
        
        System.out.println(sb.isEmpty());
        
        sb.append("a").append("b").append("c");
        
        System.out.println(sb.isEmpty());
    }
}
```

```text:出力結果
true
false
```

`isEmpty()` メソッドで文字列が空かどうか分かる。

##clear()
```java:
import org.apache.commons.lang3.text.StrBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        StrBuilder sb = new StrBuilder(1);
        System.out.println("初期キャパシティ：" + sb.capacity());
        
        sb.append("a").append("b").append("c");
        System.out.println("文字列追加後のキャパシティ：" + sb.capacity());
        
        sb.clear();
        System.out.println("clear()後のキャパシティ：" + sb.capacity());
        System.out.println("sb.isEmpty() = " + sb.isEmpty());
        
        sb.minimizeCapacity();
        System.out.println("minimize後のキャパシティ：" + sb.capacity());
    }
}
```

```text:出力結果
初期キャパシティ：1
文字列追加後のキャパシティ：4
clear()後のキャパシティ：4
sb.isEmpty() = true
minimize後のキャパシティ：0
```

`clear()` メソッドで今まで追加していた文字列を全て削除できる。

ただし、内部で保持している文字バッファのサイズは依然として確保されたままになる。

文字バッファのサイズを減らしたい場合は `minimizeCapacity()` メソッドを実行する。

##appendln()
```java:
import org.apache.commons.lang3.text.StrBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        StrBuilder sb = new StrBuilder();
        
        sb.appendln("a")
          .append("b").append("c");
        
        System.out.println(sb);
    }
}
```

```text:出力結果
a
bc
```

`appendln()` メソッドを使えば、追加した文字の後ろに勝手に改行コードを付けてくれる。これは地味にありがたい。

改行コードだけ追加したい場合は、 `appendNewLine()` を使う。

##appendAll()とappendWithSeparators()
```java:
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang3.text.StrBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        StrBuilder sb = new StrBuilder();
        
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        
        sb.appendAll(list);
        
        System.out.println(sb);
        
        sb.clear();
        
        sb.appendWithSeparators(list, ",");
        
        System.out.println(sb);
    }
}
```

```text:出力結果
1234
1,2,3,4
```

`appendAll()` で引数に指定した List や配列の中身を全て追加してくれる。
`appendWithSeparators()` なら第二引数で指定した区切り文字を要素の間に挿入してくれる。

##appendSeparator()
```java:
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang3.text.StrBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        StrBuilder sb = new StrBuilder();
        
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        
        for (int i : list) {
            sb.appendSeparator(",");
            sb.append(i);
        }
        
        System.out.println(sb);
    }
}
```

```text:出力結果
1,2,3,4
```

StrBuilder が __空文字でない__ ときに `appendSeparator()` を使うと、引数で指定した文字が追加される。
つまり、上記のようにループの最初で `appendSeparator()` を使うようにすれば、自然と区切り文字を挿入することができるようになる。

##appendFixedWidthPadLeft()とappendFixedWidthPadRight()
```java:
import org.apache.commons.lang3.text.StrBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        StrBuilder sb = new StrBuilder();

        sb.appendln("123")
          .appendFixedWidthPadLeft("a",     3, '*').appendNewLine()
          .appendFixedWidthPadLeft("ab",    3, '*').appendNewLine()
          .appendFixedWidthPadLeft("abc",   3, '*').appendNewLine()
          .appendFixedWidthPadLeft("abcd",  3, '*').appendNewLine();

        System.out.println(sb);

        sb.clear();

        sb.appendln("123")
          .appendFixedWidthPadRight("a",     3, '*').appendNewLine()
          .appendFixedWidthPadRight("ab",    3, '*').appendNewLine()
          .appendFixedWidthPadRight("abc",   3, '*').appendNewLine()
          .appendFixedWidthPadRight("abcd",  3, '*').appendNewLine();

        System.out.println(sb);
    }
}
```

```text:出力結果
123
**a
*ab
abc
bcd

123
a**
ab*
abc
abc
```

`appendFixedWidthPadLeft()` は、文字を追加した後に左から固定幅で文字を埋め込む。
追加した文字が固定幅より大きい場合は、左から順に文字が切り捨てられていく。

`appendFixedWidthPadRight()` は左右を逆にした動きになる。

##appendPadding()
```java:
import org.apache.commons.lang3.text.StrBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        StrBuilder sb = new StrBuilder();
        
        sb.append("a").appendPadding(5, '*').append("b");
        
        System.out.println(sb);
    }
}
```

```text:出力結果
a*****b
```

`appendPadding()` で指定した文字を、指定した数だけ追加できる。

##setNullText()
```java:
import org.apache.commons.lang3.text.StrBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        String nullText = null;
        
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(nullText);
        System.out.println("StringBuilder に null を append した場合 > " + stringBuilder);
        
        StrBuilder strBuilder = new StrBuilder();
        strBuilder.append(nullText);
        System.out.println("StrBuilder に null を append した場合 > " + strBuilder);
        
        strBuilder.setNullText("NULL");
        strBuilder.append(nullText);
        System.out.println("setNullText() を指定した後 > " + strBuilder);
    }
}
```

```text:出力結果
StringBuilder に null を append した場合 > null
StrBuilder に null を append した場合 > 
setNullText() を指定した後 > NULL
```

StringBuilder に null を append した場合、 "null" という文字列が追加されるが、
StrBuilder はデフォルトでは null を append すると空文字が追加される。

null を append したときに追加される文字は `setNullText()` で変更できる。

#参考
- [StrBuilder (Commons Lang 3.1 API)](http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/text/StrBuilder.html)