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

user2620644 picture user2620644 · Feb 3, 2017 · Viewed 17.9k times · Source

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?

Answer

Landei picture Landei · Feb 3, 2017

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