Wie verwenden von Streams in Java 8 zu sammeln, ein paar Felder in einer Liste?
So habe ich zum Beispiel Klasse Person
mit Namen und Familienname Felder.
Will ich sammeln List
von String
(die Namen und die Familiennamen alle zusammen) aus List
von Person
, aber es scheint, dass ich kann nicht mit ansehen zweimal pro Liste oder nicht verwenden können, Strom zweimal pro Liste.
Mein code ist:
persons.stream()
.map(Person::getName)
.collect(Collectors.toSet())
.stream().map(Person::getSurname)
.collect(Collectors.toList())
aber es sagt mir, dass Person::getSurname
non-statische Methode kann nicht verwiesen werden, aus statischen Kontext.
Was mache ich falsch?
- Vermutlich
Person::getName
gibt eineString
? Dann sammeln Sie, dass die Erträge einerSet<String>
. So können Sie nicht rufenPerson::getSurname
auf die Elemente. - Was wird das Ergebnis sein soll? Nur ein
List<String>
mit Ihnen allen zusammen gemischt? - Wenn du sagst "die Namen und die Familiennamen alle zusammen", meinst du verkettet? Abwechselnd?
- Jorn Vernee, das ist richtig!
- khelwood, ja, mischen Sie einfach den Namen und Familiennamen in einer Liste.
- Sie sind wahrscheinlich auf der Suche nach
persons.stream().flatMap(p -> Stream.of(p.getName(), p.getSurname()).collect(Collectors.toSet())
- Alexis C, vielen Dank!!! ganz das, was ich suchte!
- werfen Sie einen Blick stackoverflow.com/questions/26684562/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um sowohl die Namen und die Familiennamen in der gleichen Liste, Sie könnten dies tun:
Optional<A>
, die hat eine normalemap
- Funktion mit einerFunction<A,B>
zu verwandeln den Inhalt desOptional
. Aber in einigen Fällen müssen Sie eine Funktion, die Ergebnisse in wrapper-Typ selbst, z.B.Function<A,Optional<B>>
. Mitmap
Ergebnis wäre eine geschachtelteOptional<Optional<B>>
, so Bedarf es einer Methode statt, die "Schalen des" oder "verflacht" eine Ebene - und das ist, wo Sie verwendenflatMap
. In unserem Fall, jedes element ist in einerStream
selbst, undflatMap
"klebt" dieseStream
s zusammen.Wenn du tust :
Das Ergebnis ist ein
Set<String>
enthält nur diename
despersons
.Dann bist du mit dem erstellen einer stream von diesem
Set
und nicht von IhremList<Person> persons
.Das ist, warum Sie nicht verwenden können
Person::getSurname
zum anzeigen dieserSet
.Die Lösung von @Alexis C. :
persons.stream().flatMap(p -> Stream.of(p.getName(), p.getSurname()).collect(Collectors.toSet())
muss die Arbeit machen.Stream<String>
produziert vonStream.of(p.getName(), p.getSurname())
in 1Stream<String>
und dann sammelt man innerhalb einesSet
.Dein code sollte ungefähr so Aussehen, dass:
wenn die person hat Vorname und zweiter Vorname, optional dann folgenden code verwenden,