Java 8 StringJoiner

Java 8 StringJoiner

1. 前書き

StringJoinerは、Java 8のjava.utilパッケージに追加された新しいクラスです。

簡単に言えば、it can be used for joining Strings making use of a delimiter, prefix, and suffix.

2. 要素を追加する

add()メソッドを使用してStringsを追加できます。

@Test
public void whenAddingElements_thenJoinedElements() {
    StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX);
    joiner.add("Red")
      .add("Green")
      .add("Blue");

    assertEquals(joiner.toString(), "[Red,Green,Blue]");
}

リストのすべての要素を結合する場合は、リストをループする必要があります。 残念ながら、StringJoinerを使用してそれを行う簡単な方法はありません。

@Test
public void whenAddingListElements_thenJoinedListElements() {
    List rgbList = new ArrayList<>();
    rgbList.add("Red");
    rgbList.add("Green");
    rgbList.add("Blue");

    StringJoiner rgbJoiner = new StringJoiner(
      ",", PREFIX, SUFFIX);

    for (String color : rgbList) {
        rgbJoiner.add(color);
    }

    assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]");
}

3. 建設

To construct an instance of StringJoiner, we need to mention the delimiter.オプションで、結果に表示されるプレフィックスとサフィックスを指定することもできます。

private String PREFIX = "[";
private String SUFFIX = "]";

@Test
public void whenEmptyJoinerWithoutPrefixSuffix_thenEmptyString() {
    StringJoiner joiner = new StringJoiner(",");

    assertEquals(0, joiner.toString().length());
}

@Test
public void whenEmptyJoinerJoinerWithPrefixSuffix_thenPrefixSuffix() {
    StringJoiner joiner = new StringJoiner(
      ",", PREFIX, SUFFIX);

    assertEquals(joiner.toString(), PREFIX + SUFFIX);
}

toString()を使用して、ジョイナから現在の値を取得します。

ジョイナから返されるデフォルト値に注意してください。 A Joiner without prefix and suffix returns an empty String whereas joiner with prefix and suffix returns a String containing both prefix and suffix.

setEmptyValue()を使用して、返されるデフォルトのStringを変更できます。

@Test
public void whenEmptyJoinerWithEmptyValue_thenDefaultValue() {
    StringJoiner joiner = new StringJoiner(",");
    joiner.setEmptyValue("default");

    assertEquals(joiner.toString(), "default");
}

@Test
public void whenEmptyJoinerWithPrefixSuffixAndEmptyValue_thenDefaultValue() {
    StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX);
    joiner.setEmptyValue("default");

    assertEquals(joiner.toString(), "default");
}

ここで、両方のジョイナはEMPTY_JOINER定数を返します。

デフォルト値は、StringJoinerが空の場合にのみ返されます。

4. ジョイナーをマージする

merge()を使用して2つのジョイナーをマージできます。 指定されたStringJoinerwithout prefix and suffixの内容を次の要素として追加します。

@Test
public void whenMergingJoiners_thenReturnMerged() {
    StringJoiner rgbJoiner = new StringJoiner(
      ",", PREFIX, SUFFIX);
    StringJoiner cmybJoiner = new StringJoiner(
      "-", PREFIX, SUFFIX);

    rgbJoiner.add("Red")
      .add("Green")
      .add("Blue");
    cmybJoiner.add("Cyan")
      .add("Magenta")
      .add("Yellow")
      .add("Black");

    rgbJoiner.merge(cmybJoiner);

    assertEquals(
      rgbJoiner.toString(),
      "[Red,Green,Blue,Cyan-Magenta-Yellow-Black]");
}

rgbJoiner“,”.を使用している間に、“-“を使用してcmybJoinerのコンテンツを連結する方法に注意してください。

5. Stream API

StringJoinerでできることはこれでほぼすべてです。

StreamAPIにあるもう1つの間接的な使用法があります。

@Test
public void whenUsedWithinCollectors_thenJoined() {
    List rgbList = Arrays.asList("Red", "Green", "Blue");
    String commaSeparatedRGB = rgbList.stream()
      .map(color -> color.toString())
      .collect(Collectors.joining(","));

    assertEquals(commaSeparatedRGB, "Red,Green,Blue");
}

Collectors.joining()は、内部でStringJoinerを使用して結合操作を実行します。

6. 結論

このクイックチュートリアルでは、StringJoinerクラスの使用方法を説明しました。 全体として、StringJoinerは非常に原始的であり、リストの要素を結合するなどのいくつかの基本的なユースケースに対処できません。 主にCollectors用に設計されているようです。

StringJoinerが要件を満たしていない場合は、Guavaなどの他の一般的で強力なライブラリがあります。

そして、いつものように、すべてのソースはover on GitHubで見つけることができます。