How to use stream in Java 8 to collect a couple of fields into one list?

22,404

Solution 1

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());

Solution 2

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.

Solution 3

Your code should look something like that:

persons.stream()
.map(person -> person.getName() + " " + person.getSurname)
.collect(Collectors.toList());
Share:
22,404
user2620644
Author by

user2620644

Updated on November 02, 2020

Comments

  • user2620644
    user2620644 over 3 years

    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?