Java 8 bekommen, alle Elemente in der Liste
Ich habe eine Liste von Objekten, wobei jedes Objekt zurückgibt List<String>
.
Wie kann ich mit Java 8 streams", um nur ein List<String>
?
Contact
- Klasse hat die folgende Methode;
public List<String> getSharedFriendsIds() {
return sharedFriendsIds;
}
Und ich habe
List<Contact> contactsList;
Was ich versucht habe war
List<String> sharedContacts = contactsList.stream()
.map(Contact::getSharedFriendsIds)
.sequential()
.collect(Collectors.toList());
Aber obige Zeile ist nicht Rückkehr List<String>
sondern List<List<String>>
das ist nicht das, was ich will.
- Warum müssen Sie
.sequential()
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie verwenden
.flatMap()
zum erstellen einer einzelnen Liste aus dersharedFriendsIds
Liste enthalten ist, die in jedemContact
Objekt aus der ListecontactsList
. Bitte überprüfen Sie;Den
.filter()
Anruf ist für den Fall, wenn es eineContact
mitsharedFriendsIds == null
in der Liste, da dazu führen würde, dassNPE
in die nächste Zeile, sollten wir filtern diese heraus. Es gibt andere Wege, um zu erreichen, dass wie;-
Optional
-
emptyIfNull()
Können Sie Sammlungen Abhängigkeit von
apache.commons
und verwendenCollectionUtils.emptyIfNull
- Methode wie folgt;dann rufen Sie diese aus dem original-stream wie;
Auch Sie verwendet
.sequential
für die Art Logik, ich denke, Sie sollte verwendet habe.sorted
Methode, da die sequentielle ist für die Auslösung von nicht-parallelen Nutzung, die bereits die Standard-Konfiguration einesStream
.getSharedFriendsIds()
Gegenzug einen leeren stream stattnull
.getSharedFriendsIds()
zweimal. Dies kann leicht vermieden werden, indem Sie eine.map(Contact::getSharedFriendsIds)
zuerst, bevor die.filter
Schritt. Man könnte sogar zwingen, die filter-und flatmap Schritt, z.B..map(Contact::getSharedFriendsIds) .flatMap(list->list!=null? list.stream(): null)
, aber das ist nur eine Frage des Geschmacks...Gibt es keinen Grund für die Verwendung
.sequential()
hier sind streams sequenziell standardmäßig.In der natürlichen Reihenfolge;
Einem Muster, das ich gefunden habe, sehr nützlich ist, damit der übergeordneten Klasse (in diesem Fall die
Contact
Klasse) erstellen und die Rückkehr der Ströme von untergeordneten Objekten (in diesem Fall der Anteil Freunde-ids):Des übereinkommens ist, um den Namen der Methode, die gibt den stream als Attribut gestreamt werden. Diese Methode enthält bereits die null-check.
Dann bekommen die auch gemeinsame Freunde-ids für alle Kontakte ist viel einfacher:
Müssen Sie
flatMap()
um glätten die Elemente von der child-Liste in einer einzigen Liste, sonst würden Sie erhalten eine Liste mit streams.Hinweis 1: Sie brauchen nicht zu verwenden
sequential()
, da mitstream()
auf der Liste der Kontakte gibt bereits einen sequenziellen stream.Hinweis 2: wenn Sie wollen, dass die endgültige Liste sortiert werden, dann sollten Sie
sorted()
auf dem stream: