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?
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());
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.
Votre code devrait ressembler à quelque chose comme ça:
persons.stream()
.map(person -> person.getName() + " " + person.getSurname)
.collect(Collectors.toList());
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));