Ich habe eine Liste von Ganzzahlen List<Integer>
und möchte alle Ganzzahlobjekte in Zeichenfolgen konvertieren, um eine neue zu erhalten List<String>
.
Natürlich könnte ich eine neue List<String>
Liste erstellen und die Liste String.valueOf()
für jede Ganzzahl durchlaufen , aber ich habe mich gefragt, ob es eine bessere (sprich: automatischere ) Möglichkeit gibt, dies zu tun.
java
string
collections
integer
ChrisThomas123
quelle
quelle
Mit Google Collections von Guava-Project können Sie die
transform
Methode in der Lists- Klasse verwendenDas
List
zurückgegebene vontransform
ist eine Ansicht der Hintergrundliste - die Transformation wird bei jedem Zugriff auf die transformierte Liste angewendet.Beachten Sie, dass bei Anwendung auf null
Functions.toStringFunction()
ein aNullPointerException
ausgelöst wird. Verwenden Sie es daher nur, wenn Sie sicher sind, dass Ihre Liste keine null enthält.quelle
Lösung für Java 8. Etwas länger als die für Guava, aber zumindest müssen Sie keine Bibliothek installieren.
quelle
toString
Beispiel etwas länger ist , wird es für Konvertierungen, die von der Guava-Funktionsbibliothek nicht unterstützt werden, kürzer. Benutzerdefinierte Funktionen sind immer noch einfach, aber es ist deutlich mehr Code als dieser Java 8-StreamWas Sie tun, ist in Ordnung, aber wenn Sie das Bedürfnis haben, Java-it-up zu verwenden, können Sie einen Transformer und die Collect-Methode von Apache Commons verwenden , z.
..und dann..
quelle
Die Quelle für String.valueOf zeigt Folgendes:
Nicht, dass es viel ausmacht, aber ich würde toString verwenden.
quelle
Anstatt String.valueOf zu verwenden, würde ich .toString () verwenden. Es vermeidet einige der von @ johnathan.holland beschriebenen Auto-Boxen
Das Javadoc sagt, dass valueOf dasselbe zurückgibt wie Integer.toString ().
quelle
Hier ist eine Einzeiler-Lösung ohne Betrug mit einer Nicht-JDK-Bibliothek.
quelle
Eine andere Lösung mit Guava und Java 8
quelle
Nicht Java-Kern und nicht generisch, aber die beliebte Sammlungsbibliothek von Jakarta Commons bietet einige nützliche Abstraktionen für diese Art von Aufgabe. Schauen Sie sich insbesondere die Erfassungsmethoden an
CollectionUtils
Beachten Sie Folgendes, wenn Sie in Ihrem Projekt bereits Commons-Sammlungen verwenden.
quelle
An die Leute, die in jsights Antwort über "Boxen" besorgt sind: Es gibt keine.
String.valueOf(Object)
wird hier verwendet und es wird nie ein Unboxingint
durchgeführt.Ob Sie verwenden
Integer.toString()
oderString.valueOf(Object)
davon abhängen, wie Sie mit möglichen Nullen umgehen möchten. Möchten Sie (wahrscheinlich) eine Ausnahme auslösen oder "null" Zeichenfolgen in Ihrer Liste haben (möglicherweise). Wenn erstere, möchten Sie einenNullPointerException
oder einen anderen Typ werfen ?Ein kleiner Fehler in der Antwort von jsight
List
ist eine Schnittstelle, für die Sie den neuen Operator nicht verwenden können. Ich würdejava.util.ArrayList
in diesem Fall wahrscheinlich ein verwenden , zumal wir im Voraus wissen, wie lang die Liste wahrscheinlich ist.quelle
quelle
@ Jonathan: Ich könnte mich irren, aber ich glaube, dass String.valueOf () in diesem Fall die Funktion String.valueOf (Object) aufruft, anstatt in String.valueOf (int) gepackt zu werden. String.valueOf (Object) gibt nur "null" zurück, wenn es null ist, oder ruft Object.toString () auf, wenn es nicht null ist, was kein Boxen beinhalten sollte (obwohl offensichtlich das Instanziieren neuer String-Objekte beteiligt ist).
quelle
Ich denke, die Verwendung von Object.toString () für einen anderen Zweck als das Debuggen ist wahrscheinlich eine wirklich schlechte Idee, obwohl in diesem Fall die beiden funktional gleichwertig sind (vorausgesetzt, die Liste enthält keine Nullen). Es steht Entwicklern frei, das Verhalten einer toString () -Methode ohne Vorwarnung zu ändern, einschließlich der toString () -Methoden aller Klassen in der Standardbibliothek.
Machen Sie sich nicht einmal Sorgen über die Leistungsprobleme, die durch den Box- / Unboxing-Prozess verursacht werden. Wenn die Leistung kritisch ist, verwenden Sie einfach ein Array. Wenn es wirklich kritisch ist, verwenden Sie kein Java. Der Versuch, die JVM auszutricksen, führt nur zu Herzschmerz.
quelle
Eine Antwort nur für Experten:
quelle
String
) dasselbe Backing-Array (vonall
) verwendet, also tatsächlich sehr speichereffizient ist, was für die langfristige Leistung wichtig wäre. Es sei denn, Sie möchten natürlich nur eines der Elemente behalten ...Lambdaj ermöglicht dies auf sehr einfache und lesbare Weise. Angenommen, Sie haben eine Liste mit Ganzzahlen und möchten diese in die entsprechende Zeichenfolgendarstellung konvertieren. Dann könnten Sie so etwas schreiben.
Lambdaj wendet die Konvertierungsfunktion nur an, während Sie das Ergebnis iterieren.
quelle
Sie können den "Boxaufwand" nicht vermeiden; Javas generische Faux-Container können nur Objekte speichern, daher müssen Ihre Ints in Ganzzahlen eingeschlossen sein. Im Prinzip könnte es den Downcast von Object zu Integer vermeiden (da es sinnlos ist, weil Object sowohl für String.valueOf als auch für Object.toString gut genug ist), aber ich weiß nicht, ob der Compiler dafür klug genug ist. Die Konvertierung von String zu Object sollte mehr oder weniger ein No-Op sein, daher würde ich mich nicht darum kümmern.
quelle
Wir können den Iterator verwenden, um dasselbe zu erreichen.
quelle
Verwenden von Streams: Wenn das Ergebnis eine Liste von Ganzzahlen (
List<Integer> result
) ist, dann:Eine der Möglichkeiten, es zu lösen. Hoffe das hilft.
quelle
Eine etwas präzisere Lösung mit der forEach-Methode in der ursprünglichen Liste:
quelle
Nur zum Spaß eine Lösung mit dem Fors-Join-Framework jsr166y, das in JDK7 verwendet werden sollte.
(Haftungsausschluss: Nicht kompiliert. Spezifikation ist nicht finalisiert. Usw.)
In JDK7 ist es unwahrscheinlich, dass ein bisschen Typinferenz und syntaktischer Zucker vorhanden sind, um den withMapping-Aufruf weniger ausführlich zu machen:
quelle
Dies ist eine so grundlegende Aufgabe, dass ich keine externe Bibliothek verwenden würde (dies führt zu einer Abhängigkeit in Ihrem Projekt, die Sie wahrscheinlich nicht benötigen).
Wir haben eine Klasse statischer Methoden, die speziell für diese Art von Aufgaben entwickelt wurden. Da der Code dafür so einfach ist, lassen wir Hotspot die Optimierung für uns durchführen. Dies scheint in letzter Zeit ein Thema in meinem Code zu sein: Schreiben Sie sehr einfachen (unkomplizierten) Code und lassen Sie Hotspot seine Magie wirken. Wir haben selten Leistungsprobleme mit Code wie diesem - wenn eine neue VM-Version auf den Markt kommt, erhalten Sie alle zusätzlichen Geschwindigkeitsvorteile usw.
So sehr ich Jakarta-Kollektionen liebe, sie unterstützen keine Generika und verwenden 1.4 als LCD. Ich bin vorsichtig mit Google-Sammlungen, da diese als Alpha-Support-Level aufgeführt sind!
quelle
Ich wollte mich nur auf eine objektorientierte Lösung des Problems einlassen.
Wenn Sie Domänenobjekte modellieren, liegt die Lösung in den Domänenobjekten. Die Domäne hier ist eine Liste von Ganzzahlen, für die Zeichenfolgenwerte erforderlich sind.
Am einfachsten wäre es, die Liste überhaupt nicht zu konvertieren.
Um jedoch ohne Konvertierung zu konvertieren, ändern Sie die ursprüngliche Liste von Integer in List of Value, wobei Value ungefähr so aussieht ...
Dies ist schneller und beansprucht weniger Speicher als das Kopieren der Liste.
Viel Glück!
quelle