For example I have class Person
with name and surname fields.
I want to collect a List
of String
(names and surnames all together) from List
of Person
, but it seems that I can't use map twice per one list or can't use stream twice per list.
My code is:
persons.stream()
.map(Person::getName)
.collect(Collectors.toSet())
.stream().map(Person::getSurname)
.collect(Collectors.toList())
but it keeps telling me that Person::getSurname
non-static method can't be referenced from static context.
What am I doing wrong?
Stream class has toArray() method to convert Stream to Array, but there is no similar method to convert Stream to List or Set. Java has a design philosophy of providing conversion methods between new and old API classes e.g. when they introduced Path class in JDK 7, which is similar to java.
concat() in Java. Stream. concat() method creates a concatenated stream in which the elements are all the elements of the first stream followed by all the elements of the second stream. The resulting stream is ordered if both of the input streams are ordered, and parallel if either of the input streams is parallel.
To get both names and surnames in the same list, you could do this:
List<String> set = persons.stream()
.flatMap(p -> Stream.of(p.getName(),p.getSurname()))
.collect(Collectors.toList());
When you're doing :
persons.stream().map(Person::getName).collect(Collectors.toSet())
The result is a Set<String>
that contains only the name
of the persons
.
Then you're recreating a stream from this Set
and not from your List<Person> persons
.
That's why you can not use Person::getSurname
to map this Set
.
The solution from @Alexis C. :
persons.stream().flatMap(p -> Stream.of(p.getName(), p.getSurname()).collect(Collectors.toSet())
must do the job.
Your code should look something like that:
persons.stream()
.map(person -> person.getName() + " " + person.getSurname)
.collect(Collectors.toList());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With