Stellen Sie sich vor, ich habe eine Liste bestimmter Objekte:
List<Student>
Und ich muss eine andere Liste erstellen, einschließlich der ids
von Students
in der obigen Liste:
List<Integer>
Ist es möglich, eine Schleife zu vermeiden, indem Apache-Sammlungen oder Guaven verwendet werden ?
Welche Methoden sollten für meinen Fall nützlich sein?
java
list
collections
java-stream
guava
Javatar
quelle
quelle
Antworten:
Java 8 Vorgehensweise: -
quelle
Mit Guava können Sie Funktionen wie - verwenden
private enum StudentToId implements Function<Student, Integer> { INSTANCE; @Override public Integer apply(Student input) { return input.getId(); } }
und Sie können diese Funktion verwenden, um die Liste der Schüler in IDs wie - zu konvertieren.
Sicherlich wird es eine Schleife ausführen, um alle IDs zu extrahieren, aber denken Sie daran, dass Guavenmethoden die Ansicht zurückgeben und die Funktion nur angewendet wird, wenn Sie versuchen, über
List<Integer>
die Schleife zu iterieren. Wenn Sie nicht iterieren, wird die Schleife niemals angewendet .
Hinweis: Denken Sie daran , das der Ansicht ist , und wenn Sie mehrere Male zu wiederholen wollen wird es besser sein , den Inhalt in einem anderen zu kopieren ,
List<Integer>
wiequelle
Vielen Dank an Premraj für die alternative coole Option, die positiv bewertet wurde.
Ich habe Apache CollectionUtils und BeanUtils verwendet. Dementsprechend bin ich mit der Leistung des folgenden Codes zufrieden:
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, new BeanToPropertyValueTransformer("id"));
Es ist erwähnenswert, dass ich die Leistung von Guave ( Premraj bereitgestellt) und collectionUtils, die ich oben verwendet habe, vergleichen und die schnellere entscheiden werde.
quelle
Identifiable
welchegetId()
Methode definiert wird, und dann können Sie dieses einzelne Enum-Singleton-Muster verwenden, um die ID häufig zu extrahieren.Java 8 Lambda-Ausdruckslösung:
quelle
Wenn jemand nach ein paar Jahren hierher kommt:
List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
quelle
Es ist mathematisch unmöglich, dies ohne eine Schleife zu tun. Um eine Zuordnung F eines diskreten Wertesatzes zu einem anderen diskreten Wertesatz zu erstellen, muss F für jedes Element in der Ursprungsmenge arbeiten. (Dazu ist grundsätzlich eine Schleife erforderlich.)
Davon abgesehen:
Warum brauchen Sie eine neue Liste? Sie könnten sich dem Problem, das Sie lösen, falsch nähern.
Wenn Sie eine Liste von haben
Student
, sind Sie beim Durchlaufen dieser Liste nur ein oder zwei Schritte davon entfernt, die ID-Nummern der Schüler zu durchlaufen.for(Student s : list) { int current_id = s.getID(); // Do something with current_id }
Wenn Sie ein anderes Problem haben, kommentieren / aktualisieren Sie die Frage und wir werden versuchen, Ihnen zu helfen.
quelle