In Java 8 gibt es viele nützliche neue Dinge. Beispielsweise kann ich mit einem Stream über eine Liste von Objekten iterieren und dann die Werte aus einem bestimmten Feld der Object
Instanzen der Instanzen summieren . Z.B
public class AClass {
private int value;
public int getValue() { return value; }
}
Integer sum = list.stream().mapToInt(AClass::getValue).sum();
Daher frage ich, ob es eine Möglichkeit gibt, eine zu erstellen String
, die die Ausgabe der toString()
Methode aus den Instanzen in einer einzelnen Zeile verkettet .
List<Integer> list = ...
String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class
Nehmen wir an , list
ganze Zahlen enthält 1
, 2
und 3
erwarte ich , dass concatenated
ist "123"
oder "1,2,3"
.
java-8
java-stream
mat_boy
quelle
quelle
Antworten:
Eine einfache Möglichkeit besteht darin, Ihre Listenelemente in a anzuhängen
StringBuilder
Sie können auch versuchen:
Erläuterung: map konvertiert den Integer-Stream in einen String-Stream und reduziert ihn dann als Verkettung aller Elemente.
Hinweis: Dies ist,
normal reduction
was in O (n 2 ) ausgeführt wird.Verwenden Sie für eine bessere Leistung eine
StringBuilder
oder einemutable reduction
ähnliche Antwort von F. Böller.Ref: Stream-Reduzierung
quelle
join
Auf der anderen Seite würde ein einzelnes Array vorab zugewiesen, das groß genug ist, um die endgültige Zeichenfolge vor dem Auffüllen zu speichern, sodass O (n) wird.list.stream().map(Object::toString).reduce("", String::concat)
. Die Verwendungmap e-> e.toString()
ist etwas redundant.joining
In der API befindet sich ein Kollektor . Es ist eine statische Methode inCollectors
.Nicht perfekt wegen des notwendigen Anrufs
toString
, funktioniert aber. Unterschiedliche Trennzeichen sind möglich.quelle
import static java.util.stream.Collectors.joining;
Nur für den Fall, dass jemand versucht, dies ohne Java 8 zu tun, gibt es einen ziemlich guten Trick. List.toString () gibt bereits eine Sammlung zurück, die folgendermaßen aussieht:
[1,2,3]
Abhängig von Ihren spezifischen Anforderungen kann dies nach Belieben nachbearbeitet werden, solange Ihre Listenelemente nicht [] oder ,.
Zum Beispiel:
oder wenn Ihre Daten eckige Klammern enthalten könnten:
erhalten Sie eine ziemlich vernünftige Ausgabe.
Ein Array-Element in jeder Zeile kann folgendermaßen erstellt werden:
Ich habe diese Technik verwendet, um HTML-Tooltips aus einer Liste in einer kleinen App zu erstellen, mit etwa:
Wenn Sie ein Array haben, beginnen Sie stattdessen mit Arrays.asList (Liste) .toString ()
Ich werde die Tatsache völlig besitzen, dass dies nicht optimal ist, aber es ist nicht so ineffizient, wie Sie vielleicht denken, und es ist ziemlich einfach zu lesen und zu verstehen. Es ist jedoch ziemlich unflexibel - versuchen Sie insbesondere nicht, die Elemente mit replaceAll zu trennen, wenn Ihre Daten Kommas enthalten könnten, und verwenden Sie die Teilzeichenfolgenversion, wenn Ihre Daten eckige Klammern enthalten, aber für ein Array von Zahlen ist dies ziemlich viel perfekt.
quelle
List
erzwingt nicht die Struktur vontoString()
.AbstractCollection
Verwendet diese Struktur jedoch standardmäßig, und ich denke, dass alle allgemeinenList
Implementierungen in Java SE dies auch tun. Als Beispiel für eine, die dies nicht tut, wird sieorg.springframework.util.AutoPopulatingList
im Frühjahr nicht implementierttoString()
und würde daher zorg.springframework.util.AutoPopulatingList@170a1
. B. " " zurückgeben.Arrays.toString()
Dies wäre eine bessere WahlArrays.asList(list).toString()
, da es definiert ist, eine äquivalente Zeichenfolge zurückzugeben, prägnanter ist und keine zusätzliche Objekterstellung erfordert.Die anderen Antworten sind in Ordnung. Sie können jedoch auch Collectors.toList () als Parameter an Stream.collect () übergeben , um die Elemente als ArrayList zurückzugeben.
quelle
System.out.print
(ln) verwenden(list)
, wird dietoString()
Methode der Elemente zum Drucken der Liste verwendet. Dieser Code wiederholt also nur, was in dertoString
Liste passiert .StringListName = ObjectListName.stream (). Map (m -> m.toString ()) .collect (Collectors.toList ());
quelle
Oder
Mit diesem Ansatz können Sie auch ein Zeichenfolgenergebnis aus einer Liste von Objekten erstellen. Beispiel
Hier können Sie mit der Reduzierungsfunktion einen Anfangswert festlegen, an den Sie eine neue Zeichenfolge anhängen möchten. Beispiel:
quelle
Das Testen beider in Shail016 und bpedroso answer ( https://stackoverflow.com/a/24883180/2832140 ) vorgeschlagenen Ansätze , das einfache
StringBuilder
+append(String)
innerhalb einerfor
Schleife, scheint viel schneller als auszuführenlist.stream().map([...]
.Beispiel: Dieser Code durchläuft einen
Map<Long, List<Long>>
Build-JSON-String mitlist.stream().map([...]
:Auf meiner Entwicklungs-VM benötigt junit normalerweise zwischen 0,35 und 1,2 Sekunden, um den Test auszuführen. Bei Verwendung dieses folgenden Codes dauert es zwischen 0,15 und 0,33 Sekunden:
quelle
In der String-API gibt es eine Methode für die Anwendungsfälle "Joining List of String". Sie benötigen nicht einmal Stream.
quelle
Können wir das versuchen?
quelle
quelle
List
auf ein einzelnesString
und trennt jedes Element durch ein Komma (,
).Ich werde die Streams-API verwenden, um einen Stream von Ganzzahlen in eine einzelne Zeichenfolge zu konvertieren. Das Problem bei einigen der bereitgestellten Antworten besteht darin, dass sie aufgrund der String-Erstellung eine O (n ^ 2) -Laufzeit erzeugen. Eine bessere Lösung besteht darin, einen StringBuilder zu verwenden und die Strings dann als letzten Schritt zusammenzufügen.
Sie können diesen Prozess noch einen Schritt weiter gehen, indem Sie die Objektsammlung in eine einzelne Zeichenfolge konvertieren.
quelle
Mit Java 8+
Nicht die effizienteste, aber es ist eine Lösung mit einer kleinen Menge Code.
quelle
Das können Sie auch so machen.
quelle