Java - Karte eine Liste der Objekte, um eine Liste mit Werten, deren Eigenschaft Attribute
Habe ich die ViewValue Klasse wie folgt definiert:
class ViewValue {
private Long id;
private Integer value;
private String description;
private View view;
private Double defaultFeeRate;
//getters and setters for all properties
}
Irgendwo in meinem code, den ich brauche, um zu konvertieren eine Liste von ViewValue Instanzen, um eine Liste mit den Werten der id-Felder aus den entsprechenden ViewValue.
Mache ich es mit foreach-Schleife:
List<Long> toIdsList(List<ViewValue> viewValues) {
List<Long> ids = new ArrayList<Long>();
for (ViewValue viewValue : viewValues) {
ids.add(viewValue.getId());
}
return ids;
}
Gibt es einen besseren Ansatz für dieses problem?
InformationsquelleAutor mgamer | 2009-04-10
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Diese Antwort basiert auf der Idee, dass musst du ähnliche Dinge tun, die für verschiedene Personen und verschiedene Eigenschaften an anderer Stelle in Ihrem code. Wenn Sie nur müssen, konvertieren Sie die Liste der ViewValues, um eine Liste der Sehnt sich nach ID, dann bleiben Sie bei Ihrem ursprünglichen code. Wenn Sie wollen, dass eine wiederverwendbare Lösung, aber Lesen Sie weiter...
Ich würde deklarieren Sie eine Schnittstelle für die Projektion, z.B.
Dann können Sie schreiben einen einzigen generischen conversion-Methode:
Dann können Sie definieren, einfache Projektionen wie dieser:
Und wenden Sie es einfach so:
(Natürlich mit K&R Verstrebung und mehr Linien macht die Projektion Erklärung ein bisschen kürzer 🙂
Ehrlich gesagt, das wäre alles viel schöner mit lambda-Ausdrücke, aber never mind...
Ich würde sagen, es ist mehr LINQ-esque als Java-esque persönlich. Ich würde eher zu schaffen, die den conversion-code und dann isolieren die Projektion Aspekt, aber wenn Sie lieber die doppelte Konvertierung Logik Lasten der Zeiten, das ist in Ordnung. Es wäre viel schöner mit lambda-Ausdrücken, natürlich.
Ist es nicht etwas, wie wir es tun mit Comparator im Java?
Nicht wirklich -, dass nur konvertiert in int aus, was ich mich erinnere. Aber ich näherte mich dies mit der Idee der Wiederverwendung, die möglicherweise nicht erforderlich - editieren meiner Antwort, um dies zu reflektieren.
(Beachten Sie, dass meine "Lasten der Zeiten" - Kommentar war der Annahme, dies wäre erforderlich, für die verschiedenen Eigenschaften etc. als gut, eher als nur den einen.)
InformationsquelleAutor Jon Skeet
Könnte man es machen, in einem one-liner Verwendung von Commons-BeanUtils und Sammlungen:
(warum schreiben Sie Ihren eigenen code, wenn andere für Sie getan haben?)
PropertyUtils.getProperty(object, propertyName); verwendet reflektion, unter der Haube hätte, eine zusätzliche Leistung Kosten. Für die, die ich verwenden würde, statt Jon Skeet Ansatz.
Das einzige, was mir nicht gefällt ist das fehlen von Sicherheit - wenn der
viewValue.id
Feld umbenannt wurde, würde der code noch kompiliert, sondern zur Laufzeit scheitern.InformationsquelleAutor Ulf Lindback
Können wir es in einer einzigen Zeile code, die mit java 8
Weitere Infos : Java-8 - Streams
Ok, lassen Sie mich es gleich vorweg: ich möchte hinzufügen, Kommentare, dass diese Funktion aktiviert ist mit Java8, die nicht verfügbar war zu der Zeit des Schreibens. Die Antwort ist eigentlich ein großer Schritt nach vorne, was geschrieben wurde, vor 7 Jahren.
Du bist einfach nur genial mit dieser Antwort.
InformationsquelleAutor Radhakrishna Sharma Gorenta
Verwendung von google-Sammlungen. Beispiel:
UPDATE:
Auf Java 8, die Sie nicht brauchen Guave. Sie können:
Oder einfach nur:
NÄCHSTEN UPDATE (Das Letzte nach Javaslang zu Vavr name geändert):
Derzeit lohnt es sich zu erwähnen, über die Lösung mit
Javaslang Bibliothek(http://www.javaslang.io/)Vavr Bibliothek (http://www.vavr.io/). Nehmen wir an, wir haben unsere Liste mit echten Objekten:Können wir durch transformation mit der List-Klasse aus Javaslang Bibliothek (auf lange Sicht das sammeln ist nicht bequem):
Aber du wirst sehen, die macht nur mit der Javaslang Listen:
Ich Sie ermutigen, nehmen Sie einen Blick verfügbare Kollektionen und neue Arten auf, die Bibliothek (ich mag vor allem die Art Versuchen). Sie finden die Dokumentation unter der folgenden Adresse:
http://www.javaslang.io/javaslang-docs/http://www.vavr.io/vavr-docs/.PS. Aufgrund der Oracle-und der "Java" - Wort in den Namen hatten Sie ändern den Namen der Bibliothek von javaslang um etwas anderes. Sie hatten beschlossen, Vavr.
InformationsquelleAutor Przemek Nowak
Habe ich umgesetzt, eine kleine funktionale Bibliothek für diesen Anwendungsfall. Eine Methode hat diese Signatur:
Denen nimmt einen string und verwendet reflektion, um zu erstellen, rufen Sie die Eigenschaft, dann gibt es eine Liste, unterstützt von der objectList wo Holen und iterator implementiert, die mit dieser Eigenschaft nennen.
Den mapToProperty Funktionen implementiert, die in Bezug auf eine Allgemeine map-Funktion nimmt eine Funktion als mapper allerdings nur als ein weiterer Beitrag beschrieben. Sehr nützlich.
Ich schlage vor, Sie Lesen, auf basic-functionl-Programmierung und insbesondere werfen Sie einen Blick auf Funktoren (Objekte Implementierung einer map-Funktion)
Edit: Spiegelung ist wirklich nicht teuer sein. Der JVM hat sich einiges verbessert in diesem Bereich. So stellen Sie sicher, kompilieren, der Aufruf einmal und wiederverwenden.
Edit2: Beispiel-code
InformationsquelleAutor John Nilsson
Konnte man ude eine wrapper:
aber das ist auch mehr eine mühsame Arbeit, es könnte die Leistung zu verbessern.
Könnten Sie auch umzusetzen, deine und meine Lösung genericaly mit Reflexion aber, dass woud sehr schlecht für perforance.
Gibt es keine kurze und einfache generische Lösung in Java, fürchte ich. In Groovy, Sie würde einfach collect(), aber ich glaube, dass beinhaltet die Reflexion.
InformationsquelleAutor Michael Borgwardt
Hängt davon ab, was Sie dann tun, mit der
List<Long>
, und dieList<ViewValue>
Beispielsweise erhalten Sie möglicherweise ausreichende Funktionen von erstellen Sie Ihre eigene Liste-Implementierung, wickelt
List<ViewValue>
, Umsetzungiterator()
mit einem iterator-Implementierung, durchläuft die ViewValues, id zurückzugeben.InformationsquelleAutor Stephen Denne