Java 8 StringJoiner

Java 8 StringJoiner

1. Einführung

StringJoiner ist eine neue Klasse, die in Java 8 unter dem Paketjava.utilhinzugefügt wurde.

Einfach ausgedrückt,it can be used for joining Strings making use of a delimiter, prefix, and suffix.

2. Elemente hinzufügen

Wir könnenStrings mit der Methodeadd() hinzufügen:

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

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

Wenn wir alle Elemente einer Liste verbinden möchten, müssen wir die Liste durchlaufen. Leider gibt es keine einfache Möglichkeit, dies mitStringJoiner zu tun:

@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. Konstruktion

To construct an instance of StringJoiner, we need to mention the delimiter. Optional können wir auch das Präfix und Suffix angeben, die im Ergebnis vorhanden sein sollen:

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);
}

Wir verwendentoString(), um den aktuellen Wert vom Joiner abzurufen.

Beachten Sie die von den Joinern zurückgegebenen Standardwerte. A Joiner without prefix and suffix returns an empty String whereas joiner with prefix and suffix returns a String containing both prefix and suffix.

Wir können die zurückgegebenen StandardString mitsetEmptyValue() ändern:

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

Hier geben beide Joiner dieEMPTY_JOINER-Konstante zurück.

Der Standardwert wird nur zurückgegeben, wennStringJoiner leer ist.

4. Joiner zusammenführen

Wir können zwei Joiner mitmerge() zusammenführen. Es fügt den Inhalt der angegebenenStringJoinerwithout prefix and suffix als nächstes Element hinzu:

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

Beachten Sie, wie“-“ verwendet wird, um den Inhalt voncmybJoiner zu verketten, währendrgbJoiner immer noch“,”. verwenden

5. Stream API

Das ist so ziemlich alles, was wir mitStringJoiner machen können.

Es gibt noch eine indirekte Verwendung in derStream-API:

@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() verwendet internStringJoiner, um den Verbindungsvorgang durchzuführen.

6. Fazit

In diesem kurzen Tutorial haben wir gezeigt, wie die KlasseStringJoinerverwendet wird. Insgesamt scheintStringJoiner sehr primitiv zu sein und behandelt einige grundlegende Anwendungsfälle wie das Zusammenfügen der Elemente einer Liste nicht. Es scheint hauptsächlich fürCollectors ausgelegt zu sein.

WennStringJoiner nicht unseren Anforderungen entspricht, gibt es andere beliebte und leistungsstarke Bibliotheken, z. B.Guava.

Und wie üblich können alle Quellen inover on GitHub gefunden werden.