Liste von Strings mit join zusammenfügen

Eine Liste von Werten mit Trennzeichen darzustellen, ist eine recht häufige Aufgabe. Seit Java 8 ist das mit Java-Boardmitteln recht einfach zu bewerkstelligen. Davor war es notwendig eine eigene Methode zu schreiben oder eine Library wie Google Guava oder Apache Commons zu verwenden.

Inhaltsverzeichnis

Java 8: String.join() Beispiel

Seit Java 8 hat die Klasse String eine statische Methode join(). Diese nimmt das Trennzeichen und die Liste der Strings entgegen, wie im Beispiel ersichtlich:

List names = Arrays.asList("Susi", "Thomas", "Maxi");
String namesJoined = String.join(", ", names);
System.out.println(namesJoined);
// Ausgabe: Susi, Thomas, Maxi

Enthällt die Liste null-Werte wird "null" als String ausgegeben. Will man das verhindern, sollte man die Liste zuerst filtern.

Java 8 Stream API: Collectors.joining()

Wenn keine Liste von Strings, sondern anderen Objekten gegeben ist, können diese Objekt mit der map()-Methode eines Streams elegant in Strings umgewandelt werden:

Person person1 = new Person("Thomas", "Lemmé");
Person person2 = new Person("Maxi", "Müller");
Person person3 = new Person("Susi", "Huber");
List persons = Arrays.asList(person1, person2, person3);

String joined = persons.stream()
       .map(p->p.getLastName())
       .collect(Collectors.joining(", "));

System.out.println(joined);
// Ausgabe: Lemmé, Müller, Huber

Die Methode map() gibt in diesem Beispiel jeweils den Nachnamen für jede Person zurück.

Join vor Java 8 Beispiel

Wenn man gezwungen ist eine ältere Java-Version einzusetzen, und keine Library wie Google Guava oder Apache Commons einsetzen will oder kann, muss man sich eine entsprechende Methode selbst schreiben.

public static String join(String delimiter, String… strings) {
    if (strings == null || strings.length == 0) {
        return "";
    } else if (strings.length == 1) {
        return strings[0];
    } else {
        StringBuilder sb = new StringBuilder();
        sb.append(strings[0]);
        for (int i = 1; i < strings.length; i++) {
            sb.append(delimiter).append(strings[i]);
        }
        return sb.toString();
    }
}

Wenn das Array strings gleich null oder leer ist, wird ein leerer String zurückgegeben. Unter Umständen ist es besser, null-Werte nicht zu erlauben.

Wenn das Array nur einen Wert enthält, wird nur dieser zurückgegeben. Wenn das Array mehrere Werte enthält, wird ein StringBuilder erstellt, dem abwechselnd die Werte und das Trennzeichen übergeben werden.

Strings joinen mit Apache Commons

Die Klasse StringUtils enthält eine MEthode join(), wie in folgendem Beispiel ersichtlich:

List names = Arrays.asList("Susi", "Thomas", "Maxi");
String namesJoined = StringUtils.join(names, ", ");
System.out.println(namesJoined);
// Ausgabe: Susi, Thomas, Maxi

Wenn man Java 8 verwendet, hat diese Methode allerdings keinen vorteil zu String.join().

Strings joinen mit Google Guava

Google Guavas Joiner nützt ein fluent API um Strings mit Trennzeichen zu konkatenieren:

List names = Arrays.asList("Susi", "Thomas", "Maxi");
String namesJoined = Joiner.on(", ").join(names);
System.out.println(namesJoined);
// Ausgabe: Susi, Thomas, Maxi

Das obige Beispiel wirft allerdings eine Exception, wenn names einen null-Wert enthält. Um dies zu verhindern, können diese explizit ausgenmmen werden:

List names = Arrays.asList("Susi", "Thomas", null, "Maxi");
namesJoined = Joiner.on(", ").skipNulls().join(names);
System.out.println(namesJoined);
// Ausgabe: Susi, Thomas, Maxi

Mit skipNulls() werden die null-Werte einfach übersprungen.

Wenn man das allerding snicht möchte, sondern statt null einen anderen Wert anzeigen, kann man useForNull() verwenden, wie das folgende Beispiel zeigt:

List names = Arrays.asList("Susi", "Thomas", null, "Maxi");
namesJoined = Joiner.on(", ").useForNull("leer").join(names);
System.out.println(namesJoined);
// Ausgabe: Susi, Thomas, leer, Maxi

Ähnliche Artikel