Der in Java 8 bereitgestellte StringJoiner. In diesem Artikel werden die Rekruten dieses String-Spleißens vorgestellt.
Wenn Sie wissen möchten, wie viele Möglichkeiten es gibt, Zeichenfolgen zu verketten, zeige ich Ihnen eine einfache Methode. Definieren Sie in Intellij IDEA eine Java Bean und versuchen Sie dann, mithilfe von Tastenkombinationen automatisch eine toString-Methode zu generieren. IDEA fordert Sie dazu auf Generieren Sie mehrere toStrings. Strategien sind verfügbar.
![][2]
Derzeit verwendet die toString-Generierungsstrategie von IDEA I standardmäßig den von JDK 1.8 bereitgestellten StringJoiner.
einführen
StringJoiner ist eine Klasse im Paket java.util, die zum Erstellen einer durch ein Trennzeichen (optional) getrennten Zeichenfolge verwendet wird und mit dem bereitgestellten Präfix beginnen und mit dem bereitgestellten Suffix enden kann. Während dies auch mit Hilfe der StringBuilder-Klasse möglich ist, um nach jeder Zeichenfolge ein Trennzeichen anzuhängen, bietet StringJoiner eine einfache Möglichkeit, dies zu tun, ohne viel Code schreiben zu müssen.
Die StringJoiner-Klasse verfügt über 2 Konstruktoren und 5 öffentliche Methoden. Die am häufigsten verwendeten Methoden sind die Add-Methode und die ToString-Methode, die der Append-Methode und der ToString-Methode in StringBuilder ähneln.
Verwendung
Die Verwendung von StringJoiner ist relativ einfach. Im folgenden Code verwenden wir StringJoiner zum Spleißen von Zeichenfolgen.
public class StringJoinerTest {
public static void main(String[] args) {
StringJoiner sj = new StringJoiner("Hollis");
sj.add("hollischuang");
sj.add("Java干货");
System.out.println(sj.toString());
StringJoiner sj1 = new StringJoiner(":","[","]");
sj1.add("Hollis").add("hollischuang").add("Java干货");
System.out.println(sj1.toString());
}
}
Die Ausgabe des obigen Codes ist:
hollischuangHollisJava干货
[Hollis:hollischuang:Java干货]
Es ist erwähnenswert, dass es sich bei der StringJoiner(CharSequence delimiter)
Initialisierung von one tatsächlich um ein StringJoiner
Trennzeichen delimiter
und nicht um den Anfangswert der Variablenzeichenfolge handelt.
StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix)
Der zweite und dritte Parameter von sind das Präfix bzw. Suffix der verketteten Zeichenfolge.
Prinzip
Nachdem wir die einfache Verwendung vorgestellt haben, werfen wir einen Blick auf das Prinzip dieses StringJoiners und sehen, wie es implementiert wird. Schauen Sie sich hauptsächlich die Add-Methode an:
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
}
Ich habe eine bekannte Figur gesehen - StringBuilder. Ja, StringJoiner wird tatsächlich mithilfe von StringBuilder implementiert.
Wenn wir feststellen, dass StringJoiner tatsächlich von StringBuilder implementiert wird, können wir wahrscheinlich davon ausgehen, dass der Leistungsverlust dem der direkten Verwendung von StringBuilder ähnlich sein sollte !
Warum StringJoiner benötigt wird
Nachdem viele Leser die Verwendung und das Prinzip von StringJoiner verstanden haben, haben sie möglicherweise eine Frage: Offensichtlich gibt es bereits einen StringBuilder. Warum sollte ein StringJoiner in Java 8 definiert werden? Was sind die Vorteile?
Wenn der Leser genug über Java 8 weiß, können Sie möglicherweise vermuten, dass es mit Stream zusammenhängt.
Der Autor fand die Antwort auch im [Java-Dokument][3]:
Ein StringJoiner kann verwendet werden, um mithilfe von Collectors.joining(CharSequence) eine formatierte Ausgabe aus einem Stream zu erstellen.
Stellen Sie sich vor, wir hätten in Java eine solche Liste:
List<String> list = ImmutableList.of("Hollis","hollischuang","Java干货");
Wenn wir es zu einer Zeichenfolge der folgenden Form verketten möchten:
Hollis,hollischuang,Java干货
Dies kann auf folgende Weise erfolgen:
StringBuilder builder = new StringBuilder();
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.toString();
Sie können auch Folgendes verwenden:
list.stream().reduce(new StringBuilder(), (sb, s) -> sb.append(s).append(','), StringBuilder::append).toString();
Die Ausgabe unterscheidet sich jedoch geringfügig und erfordert eine sekundäre Verarbeitung:
Hollis,hollischuang,Java干货,
Sie können zur Verkettung auch „+“ verwenden:
list.stream().reduce((a,b)->a + "," + b).toString();
Bei den oben genannten Methoden ist entweder der Code kompliziert, die Leistung nicht hoch oder das gewünschte Ergebnis kann nicht direkt erzielt werden.
Um Anforderungen wie diese zu erfüllen, ist der in Java 8 bereitgestellte StringJoiner hilfreich. Für die oben genannten Anforderungen ist nur eine Codezeile erforderlich:
list.stream().collect(Collectors.joining(":"))
Das ist es. Im oben verwendeten Ausdruck lautet der Quellcode von Collectors.joining wie folgt:
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
return new CollectorImpl<>(
() -> new StringJoiner(delimiter, prefix, suffix),
StringJoiner::add, StringJoiner::merge,
StringJoiner::toString, CH_NOID);
}
Das Realisierungsprinzip besteht darin, StringJoiner zu verwenden.
Natürlich scheint es, dass ähnliche Funktionen Collector
durch die direkte Verwendung StringBuilder
erreicht werden können , aber das ist etwas mühsamer. Daher bietet Java 8 StringJoiner
eine umfassende Stream
Nutzung.
Und StringJoiner
es ist auch praktisch, Präfixe und Suffixe hinzuzufügen. Wenn die Zeichenfolge, die wir erhalten möchten, beispielsweise [Hollis,hollischuang,Java干货]
keine Hollis,hollischuang,Java
Trockenware ist, sind die Vorteile von StringJoiner noch offensichtlicher.
Zusammenfassen
In diesem Artikel wird die in Java 8 bereitgestellte variable String-Klasse – StringJoiner – vorgestellt, die zum String-Spleißen verwendet werden kann.
StringJoiner wird tatsächlich über StringBuilder implementiert, sodass seine Leistung der von StringBuilder ähnelt und außerdem nicht threadsicher ist.
Wie wählt man aus, wenn in der täglichen Entwicklung String-Spleißen erforderlich ist?
1. Wenn es sich nur um eine einfache Zeichenfolgenverkettung handelt, sollten Sie die direkte Verwendung von „+“ in Betracht ziehen.
2. Wenn die Zeichenfolgenverkettung in einer for-Schleife durchgeführt wird, sollten Sie die Verwendung StringBuilder
von and in Betracht ziehen StringBuffer
.
3. Wenn es sich List
um ein String-Spleißen handelt, sollten Sie es in Betracht ziehen StringJoiner
.