1. 序章

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

簡単に言うと、区切り文字、プレフィックス、サフィックスを使用して文字列を結合するために使用できます。

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<String> 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. 工事

StringJoinerのインスタンスを作成するには、区切り文字について言及する必要があります。オプションで、結果に存在するプレフィックスとサフィックスを指定することもできます。

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()を使用して、ジョイナーから現在の値を取得します。

ジョイナによって返されるデフォルト値に注意してください。 プレフィックスとサフィックスのないジョイナーは空の文字列を返しますが、プレフィックスとサフィックスのあるジョイナーはプレフィックスとサフィックスの両方を含む文字列を返します。

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つのジョイナーをマージできます。 指定されたStringJoiner の内容を、プレフィックスとサフィックスなしで次の要素として追加します。

@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]");
}

“-“を使用してcmybJoinerのコンテンツを連結し、 rgbJoinerは引き続き“、”を使用していることに注意してください。

5. ストリームAPI

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

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

@Test
public void whenUsedWithinCollectors_thenJoined() {
    List<String> 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 は非常に原始的であり、リストの要素を結合するなどのいくつかの基本的なユースケースに対処できません。 主にコレクター向けに設計されているようです。

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

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