2014-12-17 18 views
29

Ich vor kurzem mit einer Java 8-Klasse StringJoiner, die die Zeichenfolge mit den Trennzeichen und fügt Präfix und Suffix hinzugefügt, aber ich kann nicht verstehen, die Notwendigkeit dieser Klasse, da es auch StringBuilder im Backend verwendet und führt auch sehr einfach Vorgang des Anhängens der Strings.Warum StringJoiner, wenn wir bereits StringBuilder haben?

Fehle ich etwas, indem ich nicht wirklich den wirklichen Zweck dieser Klasse verstehe?

+2

Die einfache Implementierung schließt nicht aus, dass sie nützlich ist, wenn sie als eigenständige Klasse ausgeführt wird. Vor allem, wenn man bedenkt * wie oft * Anwendungsprogrammierer Ähnliches von Hand (oder über eine Drittanbieter-Bibliothek) machen mussten. – Holger

Antwort

12

Die Beispiele auf der StringJoiner Javadoc sind sehr gut bei der Abdeckung. Der springende Punkt, um die Wahl des Separators von der Handlung des Hinzufügens von Einträgen wegzuziehen. z.B. Sie können einen Joiner erstellen, den zu verwendenden Separator angeben und ihn an eine Bibliothek übergeben, um Elemente hinzuzufügen oder umgekehrt.

die Zeichenfolge "[George: Sally: Fred]" kann wie folgt aufgebaut sein:

StringJoiner sj = new StringJoiner(":", "[", "]"); 
sj.add("George").add("Sally").add("Fred"); 
String desiredString = sj.toString(); 

StringJoiner A verwendet werden können, formatierte Ausgabe von einem Strom zu erzeugen unter Verwendung Collectors.joining (CharSequence). Zum Beispiel:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4); 
String commaSeparatedNumbers = numbers.stream() 
    .map(i -> i.toString()) 
    .collect(Collectors.joining(", ")); 
+2

Peter, haben Sie Benchmarks bezüglich der Leistung von StringBuilder vs. StringJoiner durchgeführt? Welche würden Sie in dieser Hinsicht bevorzugen? –

+1

@Simeon Ich würde String-Joiner verwenden, wenn ich ein implizites Trennzeichen zwischen jedem Ding, das ich anhänge, und einem String-Builder, wenn nicht, möchte. Es geht nicht um Leistung, sondern darum, die gewünschte Handlung klarer zu machen. –

7

StringJoiner ist eine Art eines Collector, obwohl es nicht die Collector Schnittstelle nicht implementiert. Es verhält sich einfach so. Neben können Sie Trennzeichen, Präfix und Suffix übergeben, die StringJoiner kann verwendet werden, um formatierte Ausgabe von einem Stream Aufruf Collectors.joining(CharSequence) zu erstellen.

Dies ist besonders nützlich, wenn sie mit parallelen Strömen arbeiten, weil zu einem bestimmten Zeitpunkt der Chargen, der Prozess parallel werden werden verbunden werden müssen, und dies ist, wo die StringJoiner stattfindet.

+6

Nicht genau.Es ist eine Low-Level-Utility-Komponente, die für den Einsatz von einem Collector geeignet ist (wobei joining() tatsächlich verwendet wird), aber auch außerhalb der Streams-Welt geeignet ist. Die Leute schreiben diese Art von Schleifen die ganze Zeit. –

+1

Vielen Dank, Herr Goetz für die Klarstellung. –

10

Es kann Ihren Code in einigen Anwendungsfällen vereinfachen:

List<String> list = // ...; 

// with StringBuilder 
StringBuilder builder = new StringBuilder(); 
builder.append("["); 
if (!list.isEmpty()) { 
    builder.append(list.get(0)); 
    for (int i = 1, n = list.size(); i < n; i++) { 
     builder.append(",").append(list.get(i)); 
    } 
} 
builder.append("]"); 

// with StringJoiner 
StringJoiner joiner = new StringJoiner(",", "[", "]"); 
for (String element : list) { 
    joiner.add(element); 
} 
49

StringJoiner sehr nützlich, wenn Sie Strings in einem Stream beitreten müssen.

Als Beispiel, wenn Sie folgende Liste von Strings haben:

final List<String> strings = Arrays.asList("Foo", "Bar", "Baz"); 

Es ist viel einfacher

final String collectJoin = strings.stream().collect(Collectors.joining(", ")); 

zu verwenden, wie es mit einem StringBuilder wäre:

final String collectBuilder = 
    strings.stream().collect(Collector.of(StringBuilder::new, 
     (stringBuilder, str) -> stringBuilder.append(str).append(", "), 
     StringBuilder::append, 
     StringBuilder::toString)); 
+1

Beachten Sie, dass diese beiden Beispiele nicht identisch sind! Die erste erzeugt die Zeichenfolge "foo, Bar, Baz" und die zweite erzeugt "foo, Bar, Baz". –

+3

@PaulWagland Ja, das ist die besondere Schönheit des '.joining'. Normalerweise brauchst du * nicht * das letzte Komma ... – Koshinae

+2

@Koshinae stimme völlig zu, indem du feststellst, dass im Streamingfall auch die ohnehin schon komplizierte Aussage noch komplizierter wird! –

Verwandte Themen