web-dev-qa-db-fra.com

Comment utiliser stream dans Java 8 pour collecter quelques champs dans une liste?

Par exemple, j'ai la classe Person avec nom et nom champs.

Je veux collecter un List de String (noms et prénoms tous ensemble) de List de Person, mais il semble que je ne peux pas utiliser la carte deux fois par liste ou ne peut pas utiliser le flux deux fois par liste.

Mon code est:

persons.stream()
   .map(Person::getName)
   .collect(Collectors.toSet())
   .stream().map(Person::getSurname) 
   .collect(Collectors.toList())

mais ça continue de me dire que Person::getSurname la méthode non statique ne peut pas être référencée à partir d'un contexte statique.

Qu'est-ce que je fais mal?

13
user2620644

Pour obtenir les noms et prénoms dans la même liste, vous pouvez procéder comme suit:

List<String> set = persons.stream()
  .flatMap(p -> Stream.of(p.getName(),p.getSurname()))
  .collect(Collectors.toList());
13
Landei

Quand tu fais:

persons.stream().map(Person::getName).collect(Collectors.toSet())

Le résultat est un Set<String> Qui contient uniquement le name du persons. Ensuite, vous recréez un flux à partir de ce Set et non à partir de votre List<Person> persons.

C'est pourquoi vous ne pouvez pas utiliser Person::getSurname Pour mapper ce Set.

La solution de @Alexis C.: persons.stream().flatMap(p -> Stream.of(p.getName(), p.getSurname()).collect(Collectors.toSet()) doit faire le travail.

4
Matthieu Saleta

Votre code devrait ressembler à quelque chose comme ça:

persons.stream()
.map(person -> person.getName() + " " + person.getSurname)
.collect(Collectors.toList());
2
matejetz

si la personne a un prénom et un deuxième prénom facultatifs, utilisez le code ci-dessous

return Stream.of(Optional.ofNullable(person)
.map(Person::getFirstName)
.orElse(null),
Optional.ofNullable(person)
.map(Person::getMiddleName)
.orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.joining(SPACE));
0
Jayen Chondigara