Java8 新機能についてのまとめ 3

f:id:Naotsugu:20130915005711j:plain

Java8 の Developer preview が公開されたので、そろそろ新機能についてまとめておきます。
の3回目は StringJoiner。
 
blog1.mammb.com

文字列整形のループ処理が不要になった

Scala で言う mkString、Guava で言う Joiner でしょうか。
StringJoiner にてよくある文字列連結が簡素に表現できるようになりました。
 

プレフィックスとサフィックスならびに区切り文字を指定して文字列の整形ができます。

StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
        
System.out.println(sj.toString()); // [George:Sally:Fred]

 


Stream の collect で連結

Collectors にある joining でカンマ区切りなどできる。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparated = numbers.stream()
    .map(i -> i.toString())
    .collect(Collectors.joining(", "));
        
System.out.println(commaSeparated); // 1, 2, 3, 4

 

こっちの方が読みやすいかもしれません。

numbers.stream()
       .map(Object::toString)
       .collect(Collectors.joining(", "));

 

String の joinで文字連結

第一引数にデリミタで、可変長引数の文字を連結できます。

String message = String.join("-", "Java", "is", "cool");
System.out.println(message); // Java-is-cool

 

実際 join の内部では StringJoiner を使っています。

    public static String join(CharSequence delimiter, CharSequence... elements) {
        Objects.requireNonNull(delimiter);
        Objects.requireNonNull(elements);
        // Number of elements not likely worth Arrays.stream overhead.
        StringJoiner joiner = new StringJoiner(delimiter);
        for (CharSequence cs: elements) {
            joiner.add(cs);
        }
        return joiner.toString();
    }

 


短いですが、今回はここまで。